如果我理解正確的話,我也有類似問題的好地方。從你的問題看來,你沒有使用默認的成員資格提供者(至少是這樣)。我也沒有。所以我做的是創建一個新的授權屬性。你的情況可能是這個樣子:
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。
非常感謝您的反饋。雖然我不確定我清楚存儲庫方法IsAdmin應該如何查看?另外我得到的方法必須有返回類型:public AuthorizeAttribute() – Tim
@Tim你得到的錯誤是因爲我在構造函數上犯了一個錯誤。看到它說AuthorizeRAttribute和類被稱爲AdminOnlyAttribute。將其更改爲AdminOnlyAttribute,它應該可以工作。至於方法,我要更新我的答案。 –
感謝您的更新。那麼在ActionResult中,我應該做一個條件,如果用戶是管理員? – Tim