在实现自己的IUserStore时,类上的“可选”接口实际上是可选的吗?

我正在使用Microsoft的Asp.Net Identity框架版本2,并且正在实现我自己的IUserStore。 我的新类MyUserStore实现了IUserStore接口和IUserPasswordStore ,这是将它与UserManager类一起使用所需的。 或者至少这是我从阅读教程中收集的内容,如下所示 :

“身份系统中所需的一个接口是IUserStore” – Scott Allen

但是,当我运行代码时,情况似乎并非如此。

我初始化我的经理:

 var uMan= new UserManager(new MyUserStore()); var sMan = new SignInManager(uMan,authCtxFromOwin); 

当执行SignInManager上的sMan.PasswordSignIn(…)时,无论如何,SignInManager始终在UserManager中运行依赖于可选接口的function。 以下是SignInManager类中PasswordSignInAsync方法的来源:

 public virtual async Task 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接口,则无论何时都会抛出exception。

这是否意味着要使用UserManager和SignInManager类的默认function,您需要实现每个I * Store接口吗?

看起来解决方法是从SignInManagerinheritance并覆盖PasswordSignInAsync方法。 这是标准做法吗?

谢谢!

我发现Identity框架与所需I * Store的“可选性”不一致。 在一些公共方法中,它检查是否提供了所需的Store,在其他一些地方它只是调用该方法。 我还没弄清楚哪些是绝对必需的,哪些不能被调用。 因此,我将使用exception跟踪并实现应用程序所需的任何存储。