我正在使用微軟的Asp.Net Identity Framework版本2,並且正在實施我自己的IUserStore。我的新類MyUserStore
實現了IUserStore<MyUserClass,int>
接口和IUserPasswordStore<MyUserClass,int>
,這是與UserManager<MyUserClass,int>
類一起使用所需的。或者說,至少這是我從閱讀教程聚集像this:實現您自己的IUserStore時,該類上的「可選」接口實際上是否可選?
「的身份系統中的一個必需的接口是IUserStore」 - 斯科特 - 阿倫
但是,這似乎並沒有這樣的情況當我運行代碼。
我初始化我的經理:
var uMan= new UserManager<MyUserClass, int>(new MyUserStore());
var sMan = new SignInManager<MyUserClass, int>(uMan,authCtxFromOwin);
而當執行sMan.PasswordSignIn(...)的SignInManager,無論怎樣,SignInManager始終在依賴於可選接口的UserManager功能。下面是從SignInManager類PasswordSignInAsync方法來源:
public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
...
if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture())
{
return SignInStatus.LockedOut;
}
if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture())
{
return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture();
}
...
return SignInStatus.Failure;
}
它總是調用UserManager.IsLockedOutAsync()之前它試圖檢查密碼,如果店裏沒有實現IUserLockoutStore接口,異常得到無論什麼時候拋出每一次。
這是否意味着要使用UserManager和SignInManager類的默認功能,您需要實現每個I * Store接口?
看起來解決方法是繼承SignInManager並重寫PasswordSignInAsync方法。這是標準做法嗎?
謝謝!
在GitHub上查看源代碼的最新版本,該問題已得到解決(https://github.com/aspnet/Identity/blob/c9d27e27e6dd6c15b4228de6e5de3c1a22c15a6d/src/Microsoft.AspNet.Identity/SignInManager.cs#L94)。顯然,這對目前的版本沒有幫助,但我們將來會看到這一點。 – 2015-01-06 16:08:47