gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 授权和使用模型类的权限

转载 作者:行者123 更新时间:2023-12-03 17:20:46 25 4
gpt4 key购买 nike

这是我在这里的第一篇文章,所以你好:) 好的,让我们进入正题......
我正在用 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);
}

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

最佳答案

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

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

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

自定义授权:

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

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

因此,在您的 Controller 中,您必须添加第二个参数:
[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 中的第三个参数,以便您知道从哪个实体获取D B)。

关于asp.net-mvc - ASP.NET MVC 授权和使用模型类的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2872588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com