Asp.NET 标识自定义登录管理器



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

我看到默认模板创建了一个派生自默认值的应用程序登录管理器。

public class ApplicationSignInManager : SignInManager<User, string>

来自"帐户"控制器的"登录"操作调用

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);
}

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

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

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

为什么不直接创建另一个方法而不是重写?您的方法将返回您需要知道的任何内容 - 返回知道帐户是否实际登录或由管理员禁用的对象(我认为"禁用"是一个更好的名称 - 避免混淆)。并更改控制器以使用新方法而不是标准PasswordSignIn

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

最新更新