- 調べた分だけ。
- 割とわかりやすかった:Overview of Custom Storage Providers for ASP.NET Identity | The ASP.NET Site
- 「ASP.NET Webアプリケーション」テンプレートの認証「個人ユーザーアカウント」で作成されたコードを眺めれば何となく分かる。
Microsoft.AspNet.Identity.EntityFramework
とかはEFのCodeFirstでテーブル初期化とかDB読み書きとかやってくれるやつだけど、CodeFirstが嫌でIUserStore自作するなら不要な感じ。- UserManagerがASP.NET Identityの中心的存在の予感。
- OWIN startup classの中で
CreatePerOwinContext()
にて初期化用Funcを設定する。
- OWIN startup classの中で
PasswordHasherの入れ替え
- IPasswordHasherを実装したクラスを用意してUserManager.PasswordHasher プロパティに突っ込めばOK。
- 利用するIUserStoreにはIUserPasswordStoreを実装しておこう。
public class ApplicationUserManager : UserManager
{
public ApplicationUserManager(IUserStore
public static ApplicationUserManager Create(IdentityFactoryOptions
{
var manager = new ApplicationUserManager(new UserStore(context.Get
manager.PasswordHasher = new HogePasswordHasher();
return manager;
}
}
public class HogePasswordHasher : IPasswordHasher
{
public string HashPassword(string password)
{
// 塩を振ったりストレッチングしたりしよう
throw new NotImplementedException();
}
public PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
{
if (hashedPassword == HashPassword(providedPassword))
return PasswordVerificationResult.Success;
else
return PasswordVerificationResult.Failed;
}
}
[/csharp]
ちなみに、ASP.NET vNext のデフォルトっぽいPasswordHasherは以下の様な実装。
- Rfc2898DeriveBytesでSaltサイズのみ指定(128bitでRNGCryptoServiceProviderによって生成されるランダムSalt)にしてパスワードハッシュ生成(1000回ストレッチング)
- Salt + パスワードハッシュな文字列を返す(DBとかに保存する文字列になる)
検証時は
- DB保存的文字列からSaltとパスワードハッシュを切り離し
- そのSaltを利用して、入力されたパスワードからパスワードハッシュを計算
- 照合
2.0.0のMicrosoft.AspNet.Identity.PasswordHasher.VerifyHashedPassword()
も、vNextのコードで生成したハッシュを使って検証したら成功したので、多分同じロジック。
参考:Identity/src/Microsoft.AspNet.Identity/Crypto.cs
Roleによる認可的な
- IUserStoreにIUserRoleStoreのGetRolesAsync()を実装しておけば、あとはUserManagerがいい感じにやってくれるっぽい。
Controllerで
[csharp]
if(this.User.IsInRole(“Admin”))
{
}
[/csharp]
とか
[csharp]
[Authorize(Roles=”Admin”)]
public ActionResult Index()
{
return View();
}
[/csharp]
とか。
Viewで
[csharp]
@if (this.User.IsInRole(“Admin”))
{
}
[/csharp]
とか。