ASP.NET Identityの実装 DBからユーザ情報を取得する
データベースから生成した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でも同じような実装ができるはず。