ASP.NET Identityの実装 DBからユーザ情報を取得する


ASP.NET Identityの実装 DBからユーザ情報を取得する

ASP.NET Identiyのログイン機能実装のつづき。

データベースから生成したADO.NET Entity Data Model を使用するにはどうしたら良いんだろうと思ったので実装してみた。

  • ASP.NET Identiyを使用した認証。
  • 認証用のユーザテーブルはすでにあるものとする。
    • MSSQLに接続する。

単純にログイン画面でユーザ、パスワードが入力されたら、データベースからユーザを探し出してパスワードと一致すればOWINのミドルウェアに登録(サインイン)する。

ここで出てくるHashPasswordは文字列型なのでASP.NET Identiyのログイン機能実装で記載したIPasswordHasherを実装するか、FindAsyncをオーバーライドしてパスワード比較を実装しないとログインできないことに注意。

ADO.NET EntityDataModelの実装

まず、データべース参照クラス(DbContext)を実装する。
1."新しい項目"の追加から、ADO.NET EntityDataModelを選択する。
2."データベースからEF Designer"を選択する。
3.接続先を入力する。
4.使用するテーブルを選択する。

ADO.NET EntityDataModelをデザイナで生成すると、以下のクラスが出来た。
Models\Model1.Context.cs

public partial class TESTDBEntities : DbContext
{
    public TESTDBEntities()
        : base("name=TESTDBEntities")
    {
    }
・・・省略
    public virtual DbSet<userMst> userMsts { get; set; }
}

userMstはユーザー情報の定義を含む型クラスとなっている。

ユーザー情報をDBから取得

TESTDBEntitiesを使ってFindByNameAsyncを変更する。

public class AppUserStore : IUserStore<AppUser>, IUserStore<AppUser, string>, IUserPasswordStore<AppUser, string>
{
・・・省略
    public Task<AppUser> FindByNameAsync(string userName)
    {
      //ここでログインユーザ情報を見つけて返す処理。
      using (var db = new TESTDBEntities())
      {
          var dbUser = db.userMsts.FirstOrDefault(w => w.userName == userName);
          if (dbUser == null) return Task.FromResult(default(AppUser));
          // DBからユーザを見つけらAppUser型にして返す。
          var user = new AppUser
          {
              Id = dbUser.userCd,
              UserName = dbUser.userName,
              HashPassword = dbUser.password
          };
          return Task.FromResult(user);
      }
    }
}

実行するとデータベース上のユーザ上のデータベースを使用してログインされる。
今回DbContextを使用したが、DataSetやLink to sqlでも同じような実装ができるはず。