【问题标题】:ASP.NET MVC authorization & permission to use model classesASP.NET MVC 授权和使用模型类的权限
【发布时间】:2010-05-21 05:58:13
【问题描述】:

这是我在这里的第一篇文章,所以你好 :) 好的,让我们进入正题...... 我正在用 ASP.NET MVC 框架编写我的第一个应用程序,但在检查权限以使用模型类实例(读取、编辑)时遇到问题。示例代码如下所示:

// Controller action

[CustomAuthorize(Roles="Editor, Admin")]
public ActionResult Stats(int id)
{
    User user = userRepository.GetUser(id);

    if (user == null || !user.Activated || user.Removed)
        return View("NotFound");
    else if (!user.IsCurrentSessionUserOwned)
        return View("NotAuthorized");

    return View(user);
}

到目前为止,授权属性仅保护控制器操作,所以我的问题是:如何使 CustomAuthorize 属性不仅检查用户角色、用户名,还检查操作方法中实例化的资源(上图:用户类,但还有其他 ORM LINQ2SQL 类,如新闻、照片等)所有这些要检查的对象都有其唯一的 ID,因此用户实体有自己的 ID,新闻有他们的 ID,并且 UserID 字段引用到用户表。我应该如何解决这个问题?

【问题讨论】:

    标签: asp.net-mvc authorization


    【解决方案1】:

    如果我理解正确的话,你想让写新闻、文章的用户编辑他自己的新闻或文章,即使他没有“管理员”或“编辑”的角色..

    这是一个棘手的问题,简单的解决方案是:

    让您的 CustomAuthorize 保持原样,但让它继续执行操作,而不是返回错误视图或仅注入操作参数的东西,即:

    自定义授权:

    //..Your Role Validation Logic Here...
      if (filterContext.ActionParameters.Keys.Contains("isAuthorize"))
           {
             filterContext.ActionParameters.Remove("isAuthorize");
           }
       filterContext.ActionParameters.Add("isAuthorize", isAuthorized);
    

    其中 isAuthorized 将保存角色验证逻辑的结果。

    所以在你的控制器中,你必须添加第二个参数:

    [CustomAuthorize(Roles="Editor, Admin")]
    public ActionResult Stats(int id, bool isAuthorized)
    {
        User user = userRepository.GetUser(id);
    
        if (user == null || !user.Activated || user.Removed)
            return View("NotFound");
        else if (user.Id != CurrentUser.Id && !isAuthorized)
                //not Authorized by roles
                //not the owner get away from here =D
            return View("NotAuthorized");
    
        return View(user);
    }
    

    我假设您可以访问来自 BaseController(抽象类)中的属性的 CurrentUser。

    实施比这更复杂的事情会导致复杂的情况。

    例如可以,但不推荐:

    A.将所有者的用户 ID 作为参数发送(因此每次在 url GET 或 POST 请求上发送 ID 时,都必须添加所有者的用户 ID 作为参数)。但这可能会导致非常严重的安全漏洞,因为您依赖于通过网络发送的用户 ID,该用户 ID 可能会被用户和 woala 篡改!我现在授权了。

    B.尝试在操作过滤器中实例化对象(但您必须首先弄清楚您要实例化的实体,这可能会导致较长的 switch 语句和 CustomAuthorize 中的第三个参数,以便您知道从数据库中获取哪个实体) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-31
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多