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