0

所以,我想創建一個登錄頁面,當你輸入你的登錄憑據作爲管理員,你會得到acces。如果您不是管理員,您將重定向回登錄頁面。在我的數據庫中我有一個布爾類型的字段:用戶角色和授權

isAdmin <--datatype(byte") 

那麼你怎麼能最好的方式做到這一點?!我想以存儲庫模式的方式做到這一點,因爲它隨後變得更容易進行單元測試。

我已經搜索了很多,並開始對此事有點困惑。我應該有多少班級,模特等?!我猜一個控制器會做。任何人有任何好主意?!我讀過一些關於用戶角色的DCI模式,但是因爲它基本上「僅」檢查數據庫中的布爾值可能是過度殺毒?感謝所有的反饋。

回答

2

如果我理解正確的話,我也有類似問題的好地方。從你的問題看來,你沒有使用默認的成員資格提供者(至少是這樣)。我也沒有。所以我做的是創建一個新的授權屬性。你的情況可能是這個樣子:

public class AdminOnlyAttribute : AuthorizeAttribute { 
    IUserRepository _UserRepository; 

    public SimpleUser SimpleUser { get; set; } 

    public AdminOnlyAttribute() { 
     _UserRepository = new SqlUserRepository(new DbContext()); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     bool baseAuthorized = base.AuthorizeCore(httpContext); 
     if (!baseAuthorized) { 
      return false; 
     } 

     //Here you use your repository to check if a user is an admin or not 
     bool isAdmin = _UserRepository.IsAdmin(int.Parse(httpContext.User.Identity.Name)); 

     if (!isAdmin) { 
      return false; 
     } 

     return true; 
    } 
} 

存儲庫方法IsAdmin可能是簡單的查詢,以檢查相應於提供用戶的ID布爾。像這樣的東西(請仔細檢查,如果SingleOrDefault()是否必要):你想,像這樣

public bool IsAdmin(int userID) { 
    bool isAdmin = (from user in db.Users 
        where user.ID == userID 
        select user.isAdmin).SingleOrDefault(); 
    return isAdmin; 
} 

然後使用這個在行動:

[AdminOnly] 
public ActionResult Index(){ 
    //Code here... 
} 

當這個返回false,你的ActionResult會理論上應該重定向到登錄頁面的HttpUnauthorizedResult。

+0

非常感謝您的反饋。雖然我不確定我清楚存儲庫方法IsAdmin應該如何查看?另外我得到的方法必須有返回類型:public AuthorizeAttribute() – Tim

+0

@Tim你得到的錯誤是因爲我在構造函數上犯了一個錯誤。看到它說AuthorizeRAttribute和類被稱爲AdminOnlyAttribute。將其更改爲AdminOnlyAttribute,它應該可以工作。至於方法,我要更新我的答案。 –

+0

感謝您的更新。那麼在ActionResult中,我應該做一個條件,如果用戶是管理員? – Tim

0

您的isAdmin列是位還是字節?它應該可能是一點點。您可以創建一個查詢來檢查證書和IsAdmin列。如果一行被返回,則登錄成功。

+0

是的,我的意思,這是一個有點:) – Tim

+0

確定,所以你的意思是這樣那麼如果(ModelState.IsValid) {VAR 從userResults U =在db.Users 其中u.UserName ==「管理員」 && u.Password ==「password」 select u; } – Tim

+0

不,我的意思是更像Kensai在IsAdmin存儲庫方法中的上述帖子中所寫的內容,不同之處在於您可以傳遞用戶名和密碼。 'public User IsAdmin(string username,string password){return(from user in db.Users where user.username == username && user.password == password && user.IsAdmin == true select user).SingleOrDefault(); }' – bmosh