2014-11-21 54 views
12

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

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

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

有2个问题与此有关。首先,这假定“userName”对每个用户都是唯一的。虽然这可以安全地假设。

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

任何人都可以提供很好的解决方案吗?

回答

12

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

关于用户名的唯一性 - 是的,用户名是唯一的 - 这是用户登录的唯一方式。否则,如果有两个账户具有相同的用户名,那么系统将如何知道哪个账户要使用密码?

相关问题