这是我的第一篇帖子,所以你好:)好的,让我们谈谈...... 我在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字段引用到Users表。我该如何解决这个问题?
答案 0 :(得分:1)
如果我理解正确,你想让写新闻,文章的用户编辑他自己的新闻或文章,即使他没有“管理员”或“编辑”的角色..
这是一个棘手的问题,简单的解决方案是:
让你的CustomAuthorize原样,但让它继续Action,而不是返回错误View或者只是注入一个动作参数,即:
<强> CustomAuthorize:强>
//..Your Role Validation Logic Here...
if (filterContext.ActionParameters.Keys.Contains("isAuthorize"))
{
filterContext.ActionParameters.Remove("isAuthorize");
}
filterContext.ActionParameters.Add("isAuthorize", isAuthorized);
WhereAuthorized将保存角色验证逻辑的结果。
因此,在您的控制器中,您必须添加第二个参数:
[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(abstrac类)中的属性的CurrentUser。
实施比这更精细的事情将导致复杂的情况。
例如你可以,但不推荐:
一个。将所有者的userID作为参数发送(因此,每次在URL GET或POST请求上发送ID时,都必须将所有者的用户ID作为参数添加)。但这可能会导致非常丑陋的安全漏洞,因为您依赖于可能被用户和woala篡改的线路发送的用户ID!我现在授权。
B中。尝试在动作过滤器中实例化对象(但是你必须首先弄清楚你想要实例的实体,这可能会导致一个长的switch语句和CustomAuthorize中的第三个参数,因此你知道从DB获取哪个实体)