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

时间:2015-07-22 09:25:31

标签: c# asp.net-mvc asp.net-identity-2

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

我在stackoverflow帖子(Writing a custom IUserPasswordStore and SignInManager.PasswordSignInAsync in Identity 2.1)中读到了我只需要覆盖UserManager中的CheckPasswordAsync方法。

我尝试在IdentityConfig.cs文件中覆盖此方法。以下是我添加到ApplicationUserManager类的代码,仅用于测试此解决方案:

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

问题是此代码永远不会在登录过程中运行,并且登录始终失败。要登录用户我正在使用SignInManager.PasswordSignInAsync登录用户,这是在asp.net MVC 5中创建新的Web应用程序时的默认设置。此方法不应该调用ApplicationUserManager。 CheckPasswordAsync?或者这项工作还需要另一种配置吗?

3 个答案:

答案 0 :(得分:8)

它应该工作。我刚刚使用了标准的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;
}

你会看到它通过:

enter image description here

答案 1 :(得分:4)

问题在于我尝试使用系统中不存在的用户登录。

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

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

答案 2 :(得分:0)

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

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