所以我想创建一个登录页面,当您以管理员身份输入登录凭据时,您将获得访问权限。如果您不是管理员,则会重定向回登录页面。在我的数据库中,我有一个布尔类型字段:
isAdmin <--datatype(byte")
那么你怎么能以最好的方式做到这一点?!我想以存储库模式的方式执行此操作,因为它更容易进行单元测试。
我已经搜索了很多内容并开始对此事感到困惑。我应该有多少班级,型号等?!我猜一个控制器会这样做。有人有什么好主意吗?!我已经阅读了一些有关用户角色的DCI模式但是因为它基本上“仅”来检查数据库中的布尔值是否有点过分?感谢所有反馈。
答案 0 :(得分: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,理论上它应该重定向到登录页面。
答案 1 :(得分:1)
您应该创建一个自定义成员资格提供程序,并将用户isAdmin作为ValidateUser的一部分进行检查。
或者,如果允许其他用户使用,请使用自定义角色提供程序。
以下链接是一个很好的起点
http://theintegrity.co.uk/2010/11/asp-net-mvc-2-custom-membership-provider-tutorial-part-1/
答案 2 :(得分:0)
你的isAdmin列是一位还是一个字节?它可能应该是一点点。您可以创建一个检查凭据和IsAdmin列的查询。如果返回一行,则登录成功。