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

Raf*_*afe 10 .net c# asp.net owin asp.net-identity

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

当执行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;
        }
Run Code Online (Sandbox Code Playgroud)

它总是在尝试检查密码之前调用UserManager.IsLockedOutAsync(),因此如果存储没有实现IUserLockoutStore接口,则无论何时都会抛出异常.

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

看起来解决方法是从SignInManager继承并覆盖PasswordSignInAsync方法.这是标准做法吗?

谢谢!

tra*_*max 7

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

  • 看起来他们试图摆脱会员资格的情况,在这种情况下,您只有一个接口,需要实现数百个方法,但没有成功 - 他们将所有内容拆分为更小的接口,但结果您仍然拥有巨大的 UserStore 类。 (3认同)