我'm working with Microsoft'是Asp.Net Identity框架版本2,我正在实现我自己的IUserStore . 我的新类 MyUserStore
实现了 IUserStore<MyUserClass,int>
接口和 IUserPasswordStore<MyUserClass,int>
,这是将它与 UserManager<MyUserClass,int>
类一起使用所需的 . 或者至少这是我从阅读教程中收集的内容,如this:
“身份系统中所需的一个接口是IUserStore” - Scott Allen
但是,当我运行代码时,情况似乎并非如此 .
我初始化我的经理:
var uMan= new UserManager<MyUserClass, int>(new MyUserStore());
var sMan = new SignInManager<MyUserClass, int>(uMan,authCtxFromOwin);
当执行SignInManager上的sMan.PasswordSignIn(...)时,无论如何,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方法 . 这是标准做法吗?
谢谢!
1 回答
我发现Identity框架与所需I * Store的“可选性”不一致 . 在一些公共方法中,它检查是否提供了所需的Store,在其他一些地方它只是调用该方法 . 我还没弄清楚哪些是绝对必需的,哪些不能被调用 . 因此,我将使用异常跟踪并实现应用程序所需的任何存储 .