【问题标题】:Build a custom user check password in Asp.Net Identity 2在 Asp.Net Identity 2 中构建自定义用户检查密码
【发布时间】:2015-10-12 02:09:17
【问题描述】:

我需要在 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?或者这项工作需要其他配置?

【问题讨论】:

  • 您是否按照Introduction to ASP.NET Identity 指南触发身份验证过程?如果没有,你是怎么做到的?你需要在你的问题中解释它。
  • 我真的没有遵循任何配置过程。我刚刚创建了一个空的 Web 应用程序并尝试更改检查密码过程。我会按照你的建议来看看我的自定义检查密码是否有效。
  • @Albireo 我阅读了 ASP.NET 身份简介指南,我了解到我可以更改登录控制器以使用我的自定义用户检查密码方法。但我的问题仍然存在。如果我覆盖 ApplicationUserManager.CheckPasswordAsync 它不应该在我调用 SignInManager.PasswordSignInAsync 方法时被调用?
  • 我的问题只是试图缩小你的情况:其他地方可能有一些缺失或错误(如LeftyX said,它应该工作),但没有看到整个代码很难分辨。
  • 您是在用户显式访问页面时手动调用该方法,还是使用 OWIN 来处理点击Authorize'd 操作的未经身份验证的用户?

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


【解决方案1】:

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

你会看到它通过:

【讨论】:

  • 您使用的在线模板到底是什么?我只是找到了一个名为 ASP.NET_MVC5_Bootstrap3_3_1_LESS 的模板,但它表明生成的代码并不完全是您使用的。在控制器登录的这个例子中,它使用 UserManager.FindAsyncn 方法而不是 SignInManager.PasswordSignInAsync 方法。
  • 对不起,我更正了我的答案。我的意思是使用标准的 Asp.Net MVC 模板。来自 Visual Studio 2013 - 新项目 Web - ASP.NET Web 应用程序 - MVC;身份验证 = 个人用户帐户。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2016-03-30
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      相关资源
      最近更新 更多