在 Asp.Net Identity 2 中构建自定义用户检查密码

Build a custom user check password in Asp.Net Identity 2

我需要在 asp.net MVC 5 中实现并使用 Asp.Net Identity 2 的应用程序中构建自定义用户密码检查。

我在 Whosebug post () 中读到我只需要覆盖 UserManager 中的 CheckPasswordAsync 方法。

我尝试在 IdentityConfig.cs 文件中覆盖此方法。这是我添加到 ApplicationUserManager class 的代码,只是为了测试这个解决方案:

public override async Task<bool> CheckPasswordAsync(ApplicationUser user,   string password)
{
        return await Task.Run(() => {
            return true;
        });
}

问题是登录过程中从来没有运行这个代码,登录总是失败。要登录用户,我使用 SignInManager.PasswordSignInAsync 登录用户,这是在 asp.net MVC 5 中创建新 Web 应用程序时的默认设置。此方法不应该调用 ApplicationUserManager。检查密码异步?或者这项工作需要其他配置?

应该可以。我刚刚使用了标准 ASP.NET MVC 模板,通过 NuGet 更新了所有涉及的库,它一定可以工作。

我想问题出在你覆盖方法的方式上。

在你的 ApplicationUserManager 中尝试像这样更改你的代码:

public override Task<bool> CheckPasswordAsync(ApplicationUser user, string password)
{
    return Task.FromResult<bool>(true);
}

或:

public override Task<bool> CheckPasswordAsync(ApplicationUser user, string password)
{
    return Task.Run(() => MyCheckPasswordAsync());
}

private bool MyCheckPasswordAsync()
{
    return true;
}

你会看到它通过:

问题是我试图用系统中不存在的用户登录。

SignInManager.PasswordSignInAsync 从不调用 ApplicationUserManager。 CheckPasswordAsync 如果用户不存在于用户存储库中。

总之,我必须将用户存储在我的应用程序中或实施自定义用户存储机制。

这可能不是直接的答案,但它提供了问题的完整解决方案。他实现了一个自定义授权过滤器,然后您可以对其进行自定义以执行您想要的操作。

https://weblog.west-wind.com/posts/2013/Apr/18/A-WebAPI-Basic-Authentication-Authorization-Filter

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class BasicAuthenticationFilter : AuthorizationFilterAttribute

然后可以像这样使用而不是 [Authorize] 属性

[MyBasicAuthenticationFilter]
public class QueueController : ApiController