2016-11-10 36 views
6

私は、認証の詳細がSQLデータベースに格納されている私のWebサイトにユーザーがログインするためにasp.net Identity 2.0を使用しています。 Asp.netアイデンティティは、多くのオンラインチュートリアルで見られるように標準的な方法で実装されています。私は新しいユーザーを登録すると、私はRegisterBindingModelCodeカスタムプロパティを渡すが、私はこれを挿入するかどうかはわかりませんカスタムプロパティでIdentityUserを拡張する方法

public class ApplicationUser : IdentityUser 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType) 
    { 
     CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); 
     return userIdentity; 
    } 
    //My extended property 
    public string Code { get; set; } 
} 

IdentityModelsApplicationUserクラスには、カスタムプロパティを含むように拡張されましたカスタムプロパティをWebUsersテーブルに追加します。

私は以下のようにしましたが、実際にこのプロパティをユーザ名とパスワードと共にテーブルに挿入しません。

var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code }; 

、全体の機能:

[AllowAnonymous] 
[Route("Register")] 
public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     var userName = !string.IsNullOrEmpty(model.UserName) ? model.UserName : model.Email; 
     //I set it here but it doesn't get inserted to the table. 
     var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code }; 

     IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 

     return Ok(); 
    } 

私は何をしないのですか? 私は同様の質問をしていましたが、これに対する回答が見つかりませんでした。

+0

私はあなたのコードはOKだと思いますが、 'Code'プロパティが' model'パラメータで満たされていると思いますか? – jumuro

+0

はい、私はそれを確認したと確信しています。しかし、データベースのテーブルをチェックすると、新しいユーザーが表示されますが、コードフィールドは常に「null」です。 – user3378165

+0

UserManagerはどのように定義されていますか? https://github.com/tjoudeh/AspNetIdentity.WebApi –

答えて

18

ユーザーにカスタムフィールドを追加するすべての手順を実行すると、タスクは正常に終了します。ここで

は、ユーザーにカスタムフィールドを追加するには、すべての手順です:

  1. あなたはMVCを選択し、認証個々のユーザであることを確認してくださいASP.NET Webアプリケーション
  2. を作成します。アカウント
  3. にアクセスするモデルフォルダ→開くIdentityModels.csApplicationUserクラスとプロパティを追加します。

    public string Code { get; set; } 
    
  4. TOOLSメニュー→Nugetパッケージマネージャ
  5. ゴープロジェクトをビルド→パッケージマネージャコンソール
  6. をクリックしてください

    タイプEnable-Migrationsを入力してと入力し、タスクが完了するまで待ちます。

    Checking if the context targets an existing database... 
        Code First Migrations enabled for project WebApplication1. 
    
  7. タイプAdd-Migration "Code"押しを入力して、タスクが完了を取得するまで待機を:あなたは言う応答が表示されます。

    Scaffolding migration 'Code'. The Designer Code for this migration 
    file includes a snapshot of your current Code First model. This 
    snapshot is used to calculate the changes to your model when you 
    scaffold the next migration. If you make additional changes to your 
    model that you want to include in this migration, then you can 
    re-scaffold it by running 'Add-Migration Code' again. 
    
  8. タイプUpdate-Databaseを押しを入力して、タスクが完了を取得するまで待機を:あなたは言う応答が表示されます。あなたはSQL Serverのオブジェクトエクスプローラを更新し、データベースにアクセスして、表を参照してください場合は、列の下dbo.AspNetUsersの下で、あなたはCodeフィールドが表示されます。この段階で

    Specify the '-Verbose' flag to view the SQL statements being applied 
    to the target database. 
    Applying explicit migrations: [201611132135242_Code]. 
    Applying explicit migration: 201611132135242_Code. 
    Running Seed method. 
    

    :あなたは言う応答が表示されます。あなたは、オープンのWeb.Configファイルを見て、このようなものである接続文字列を見てみるべきサーバーどのデータベースかさえ知らなかった場合:

    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication1-20161114125903.mdf;Initial Catalog=aspnet-WebApplication1-20161114125903;Integrated Security=True" 
    providerName="System.Data.SqlClient" /> 
    

    あなたは(データソースを見ることができますこれはSQL Serverのインスタンスです)と何か.mdfはデータベース名です。 モデルフォルダ→オープンAccountViewModels.csファイル→RegisterViewModelクラスへ

  9. 移動し、このプロパティを追加します。 (EF6とAPIv2では、あなたがモデルフォルダ内の以下の行を追加することができます→AccountBindingModelsは→ファイルRegisterBindingModelクラス)ビューフォルダ→アカウントフォルダ→オープンへ

    public string Code { get; set; } 
    
  10. ゴーRegister.cshtmlファイルとパスワード以下の例のために、他のフィールドの近くにこのコードを追加します。

    <div class="form-group"> 
        @Html.LabelFor(m => m.Code, new { @class = "col-md-2 control-label" }) 
        <div class="col-md-10"> 
         @Html.TextBoxFor(m => m.Code, new { @class = "form-control" }) 
        </div> 
    </div> 
    
  11. ゴーコントローラのHTTP POSTでフォルダ→オープンAccountController.csファイル→登録アクションに、これにユーザーを作成する行に変更:

    var user = new ApplicationUser { UserName = model.Email, Email = model.Email, 
        Code= model.Code }; 
    
  12. 実行プロジェクトを/Account/RegisterのURLにアクセスして、新しいユーザを登録します。ユーザーを登録した後、再度データベースにアクセスしてのデータを表示すると、コードが保存されていることがわかります。の表が表示されます。

+0

明確で詳細な答えをありがとう、唯一の欠点は、#9:"モデルフォルダに移動→AccountViewModels .cs'ファイル→ 'RegisterViewModel'クラスを、私の' AccountViewModels。cs'ファイルには 'RegisterViewModel'クラスがありません。追加する必要がありますか?ありがとうございました! – user3378165

+0

ようこそ。あなたはそれを必要とします。必要がない場合、Viewから継承されたモデルの 'Code'はありません。 –

+0

清潔なソリューションの指示に従ってください。何をしているのかは明らかです。 –

関連する問題