如果我理解正确的话,我也有类似问题的好地方。从你的问题看来,你没有使用默认的成员资格提供者(至少是这样)。我也没有。所以我做的是创建一个新的授权属性。你的情况可能是这个样子:
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