2014-11-21 107 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

關於用戶名的唯一性 - 是的,用戶名是唯一的 - 這是用戶登錄的唯一方式。否則,如果有兩個賬戶具有相同的用戶名,那麼系統將如何知道哪個賬戶要使用密碼?

相關問題