【问题标题】:User roles and authorization用户角色和授权
【发布时间】:2011-09-29 04:19:30
【问题描述】:

所以我想创建一个登录页面,当您以管理员身份输入登录凭据时,您可以获得访问权限。如果您不是管理员,您将被重定向回登录页面。在我的数据库中,我有一个布尔类型的字段:

isAdmin <--datatype(byte")

那么你怎样才能做到最好呢?!我想以存储库模式的方式执行此操作,因为这样更容易对其进行单元测试。

我在谷歌上搜索了很多,开始对此事感到有些困惑。我应该有多少类,模型等?!我猜一个控制器会做。有人有什么好主意吗?!我已经阅读了有关用户角色的 DCI 模式的一些内容,但因为它基本上“仅”检查数据库中的布尔值可能是矫枉过正?感谢所有反馈。

【问题讨论】:

    标签: asp.net-mvc-3 authorization repository-pattern login-control user-roles


    【解决方案1】:

    如果我理解正确,我遇到了类似的问题。从您的问题看来,您没有使用默认的会员资格提供商(至少是这样)。我也没有。所以我所做的是创建一个新的授权属性。在您的情况下,它可能看起来像这样:

    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 你得到的错误是因为我在构造函数上犯了一个错误。看到它说 AuthorizeRAttribute 并且该类称为 AdminOnlyAttribute。将其更改为 AdminOnlyAttribute ,它应该可以工作。至于方法,我会更新我的答案。
    • 感谢您的更新。那么在 ActionResult 我应该做一个条件,如果用户是管理员?
    • 在 Web.config 中,有一个部分处理返回 HttpUnauthorizedResult 后应显示的页面。那应该是“自动的”。默认是 找一下。
    • 好的。那么最后它应该是这样的: ?谢谢!
    【解决方案2】:

    您应该创建一个自定义的 Membership Provider 并检查用户 isAdmin 作为 ValidateUser 的一部分。

    或者,如果允许其他用户进入,请使用自定义角色提供程序。

    以下链接是一个很好的起点

    http://theintegrity.co.uk/2010/11/asp-net-mvc-2-custom-membership-provider-tutorial-part-1/

    【讨论】:

      【解决方案3】:

      您的 isAdmin 列是位还是字节?应该是有点吧。您可以只创建一个检查凭据和 IsAdmin 列的查询。如果返回一行则表示登录成功。

      【讨论】:

      • 是的,我的意思是有点:)
      • ok 所以你的意思是这样的 if (ModelState.IsValid) { var userResults = from u in db.Users where u.UserName == "admin" && u.Password == "password"选择你; }
      • 不,我的意思更像是 Kensai 在上面的帖子中在 IsAdmin 存储库方法中所写的内容,只是您可以传递用户名和密码。 public User IsAdmin(string username, string password) { return (from user in db.Users where user.username == username &amp;&amp; user.password == password &amp;&amp; user.IsAdmin == true select user).SingleOrDefault(); }
      • 好的,谢谢。因此,要在我的操作中访问查询结果,我不会将模型作为参数传递,而是像这样 [AdminOnly] 使用它??
      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2015-11-17
      • 2020-11-12
      • 2017-02-04
      • 2013-07-28
      相关资源
      最近更新 更多