繁体   English   中英

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

[英]When implementing your own IUserStore, are the “optional” interfaces on the class actually optional?

我正在使用Microsoft的Asp.Net Identity框架版本2,并正在实现自己的IUserStore。 我的新类MyUserStore实现了IUserStore<MyUserClass,int>接口和IUserPasswordStore<MyUserClass,int> ,这是将其与UserManager<MyUserClass,int>类一起使用所必需的。 或者说,至少这是我从阅读教程一样聚集这样

“身份系统中一个必需的接口是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方法。 这是标准做法吗?

谢谢!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM