gpt4 book ai didi

c# - 在实现自己的 IUserStore 时,类上的 "optional"接口(interface)实际上是可选的吗?

转载 作者:可可西里 更新时间:2023-11-01 09:10:54 27 4
gpt4 key购买 nike

我正在使用 Microsoft 的 Asp.Net Identity 框架版本 2,并且正在实现我自己的 IUserStore。我的新类MyUserStore实现 IUserStore<MyUserClass,int>接口(interface)和 IUserPasswordStore<MyUserClass,int> ,这是与 UserManager<MyUserClass,int> 一起使用所需要的类(class)。或者至少这是我从阅读 this 等教程中收集到的信息:

"The one required interface in the identity system is IUserStore" - Scott Allen

但是我运行代码的时候好像不是这样。

我初始化我的管理器:

var uMan= new UserManager<MyUserClass, int>(new MyUserStore()); 
var sMan = new SignInManager<MyUserClass, int>(uMan,authCtxFromOwin);

当 SignInManager 上的 sMan.PasswordSignIn(...) 被执行时,无论如何,SignInManager 始终运行 UserManager 中依赖于可选接口(interface)的功能。以下是 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 接口(interface),无论如何每次都会抛出异常。

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

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

谢谢!

最佳答案

我发现身份框架与所需 I*Store 的“可选性”不一致。在一些公共(public)方法中,它检查是否提供了所需的 Store,在其他一些地方,它只是调用该方法。我还没有弄清楚哪些是绝对需要的,哪些是不能调用的。因此,我会使用异常跟踪并实现您的应用程序所需的任何商店。

关于c# - 在实现自己的 IUserStore 时,类上的 "optional"接口(interface)实际上是可选的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25703776/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com