c# - Asp.NET 身份自定义 SignInManager

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

在我的应用程序中,我想添加其他条件以便用户登录。例如,出于某种原因,允许管理员“锁定”用户帐户。当帐户被锁定时,用户将无法登录。请注意,这与多次登录尝试失败导致的“锁定”不同。管理员可以删除锁定条件。

我看到默认模板创建了一个派生自默认模板的 ApplicationSignInManager。

public class ApplicationSignInManager : SignInManager<User, string>

“帐户” Controller 调用的“登录”操作

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

所以我的尝试是覆盖这个函数

public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    User user = this.UserManager.FindByName(userName);
    if (null != user)
    {
        if (true == user.AccountLocked)
        {
            return (SignInStatus.LockedOut);
        }
    }

    var result = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);

    return (result);
}

这有两个问题。首先,这假定“用户名”对于每个用户都是唯一的。虽然,这可以安全地假设。

其次,该函数实际上返回一个 SignInStatus,它由 Asp.net Identity 定义。我无法修改以返回任何其他内容,以传达登录可能失败的正确原因。

谁能为此提供好的解决方案?

最佳答案

为什么不创建另一个方法而不是覆盖?您的方法将返回您需要知道的任何信息 - 返回对象,该对象将知道帐户是否实际登录或被管理员禁用(我认为“禁用”是一个更好的名称 - 避免混淆)。并更改您的 Controller 以使用您的新方法而不是标准的 PasswordSignIn

关于用户名唯一性 - 是的,用户名是唯一的 - 这是用户登录的唯一方式。否则,如果有 2 个帐户具有相同的用户名,系统如何知道要针对哪个帐户尝试密码?

关于c# - Asp.NET 身份自定义 SignInManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27054766/

相关文章:

c# - 确定服务器是否正在监听给定端口

c# - 在一个 Controller 中有很多方法 VS 在多个 Controller 中有很多方法

c# - EventTrigger 在循环中的意外结果

asp.net - SignalR 2.0 超时连接

c# - 有效读取单个数据行

asp.net - Umbraco CMS(.NET) : Logging errors loading xslt/User controls

asp.net-mvc - 在Asp.net单元测试中缺少对System.Web.Mvc的引用?

c# - 如果 API 速率限制超过使用 WebApiThrottle - C# Web API,则阻止 API 请求 5 分钟

javascript - 如何在单击按钮时附加多个下拉列表,每个下拉列表在名称属性中具有不同的索引?

asp.net-mvc - MVC 架构 - 重新使用相同的 View 模型进行读取和编辑