MVC / ASP.Net 记录级授权最佳实践

2024-03-14

有人对在 ASP.Net MVC 网站中执行记录级授权同时保持关注点分离的好方法有什么建议吗?

使用PrincipalPermission,您可以使用以下方法修饰方法:

PrincipalPermission(SecurityAction.Demand, Role = "GroupLeader")

要求该页面的任何访问者都是固定角色“GroupLeader”的成员。

或者,您可以使用以下方法修饰方法:

[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Manage", Resource = "Group")]

要求一般允许该页面的任何访问者管理组。

然而,这些都没有真正解决用户可能有权编辑某些组但无权编辑其他组的情况。据我所知,即使我实现了自定义ClaimsAuthorizationManager,无法访问方法参数以进行条件授权。

此外,上面的两种方法都只是抛出一个SecurityException如果用户没有访问权限,而不是允许一种方法将用户优雅地重定向到一个页面,该页面解释发生了什么以及他们可能会做什么来获得必要的授权。

显然,我也意识到我可以将授权逻辑编码到方法本身中并相应地重定向,但如果可能的话,我宁愿将其分开,并保持方法代码干净,以便仅处理实际处理请求,并且能够在可以更普遍应用的框架内工作。

那么,是否有一种“开箱即用”的方法来处理这种情况,或者我是否必须实现自定义IAuthorizationFilter?我认为我可以处理记录级别的授权和优雅的重定向,但是在方法级别没有任何参数,这本质上将是一个巨大的过程if ... else if陈述。


处理这种情况的最直接的方法是在实体上创建一个属性来存储实体的“所有者”或“创建者”。然后,当您查询对象时,您可以按此进行过滤。例如:

public class Foo
{
    public int Id { get; set; }

    ...

    public string Creator { get; set; }
}

Then:

public ActionResult FooDetails(int id)
{
    var foo = db.Foos.SingleOrDefault(m => m.Id == id && m.Creator == User.Identity.Name);
    if (foo == null)
    {
        return new HttpNotFoundResult();
    }

    return View(foo);
}

通过授权过滤器来处理这个问题并不合适,因为您必须选择行来确定用户的权限。然后,您必须在操作中再次选择该行才能将其发送到视图。此外,您还必须执行一些操作才能使过滤器能够知道它应该如何从何处选择什么,以便您甚至可以首先检查权限。在操作中,您已经选择了实体,因此只需根据用户是否同时“拥有”它来调整它即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC / ASP.Net 记录级授权最佳实践 的相关文章

随机推荐

  • 如何创建一个流,其中的项目基于该流之前返回的项目?

    我有一个函数可以生成futures Stream基于一个论点 我想多次调用这个函数并将流压平在一起 使问题变得复杂的是 我想将流返回的值作为参数提供给原始函数 具体来说 我有一个函数可以将数字流返回到零 fn numbers down to
  • 具有精确 OR 值的嵌套 IF 语句

    我是 Excel IF 语句的新手 并且在我认为所谓的 IF 语句方面遇到了麻烦嵌套 IF 函数 我在这里查看了其他 IF 问题 它们对于我的新手大脑来说太复杂了 无法理解 我有一列 里面有数字 大约有十几个不同的数字 这些数字代表一个特定
  • 对重复内容不显示是否会影响 SEO/语义?

    重复内容上的 Display none 是否会影响 SEO 语义 假设您正在构建一个移动优先的响应式网站 在较小的断点处 您选择显示页面的标题标语 h1 在主要英雄横幅中 但是 稍后您希望在同一位置显示公司徽标 并在子横幅中显示您的口号 例
  • 如何获取使用 Angular $http 下载的文件的名称?

    我编写了使用 Angular http 下载文件的代码 文件的名称是notURL 中指定 URL 包含文件的唯一标识符 该标识符是从应用程序外部获取的 When http get myUrl 被调用 一切正常 文件已被检索 我可以在回调处理
  • Java 中动态转换为泛型类型

    这是我整理的一个简单的例子 private static
  • 使用 WPF 视觉层的高性能图形

    我正在创建一个 WPF 映射程序 该程序可能会同时加载数百个文件并将其绘制到屏幕上 并且用户可能想要缩放和平移此显示 其中一些文件类型可能包含数千个点 这些点很可能作为某种路径连接 其他支持的格式包括 TIFF 文件 使用一个绘制所有数据的
  • Stripe API - 收据列表

    我正在使用 Stripe API 我想向客户展示他们的发票历史记录列表以及相关收据 我在 Stripe API 中找不到任何地方 https stripe com docs api lang php https stripe com doc
  • PHP 会话很难跨分布式系统扩展吗?

    在工作中 我们几乎用 Java 和 Perl 完成所有工作 但我想使用 PHP 和会话构建一个功能 有些人认为尝试在我们的系统上进行 PHP 会话是一个坏主意 因为它分布到许多服务器 具体问题会是什么 您还可以使用自定义会话保存处理程序 h
  • 如何在条件查询中使用MAP的键?

    我有一个这样的豆子 Class TestA Map
  • 构建 python 模块并将其链接到 MacOSX 框架

    我正在尝试在 MacOSX 10 6 上构建 Python 扩展并将其链接到多个框架 仅限 i386 我使用 distutils 和 Extension 对象创建了一个 setup py 文件 我为了链接我的框架 我的LDFLAGS环境变量
  • Imshow 和 imwrite 在 matlab 中显示空白图像

    我正在尝试将图像存储在数组中以进行一些分析 当我循环该过程并将结果 imwrite 到各种文件中时 它会存储一个空白图像 与 imshow 相同 当我在控制台上打印图像数组时 这些值是它们应该的值 从 50 到 200 不等 这是我的代码出
  • 如何发出 SOAP 请求

    我正在 Android 中发出 SOAP 请求 我到底想要实现的是
  • WiX - 未定义的预处理器变量“$(var.SetupProject1.TargetDir)”

    我正在跟进本教程 http www paulsodimu co uk Post How To Create a Wix Installer For a Console Application创建 WiX 安装程序VS2017 Winform
  • 应用程序初始化非常慢:FirebaseApp初始化失败

    我知道关于这个问题 https stackoverflow com questions 37321728 firebaseinitprovider firebaseapp initialization unsuccessful但我认为这对我
  • 将本地 Nuget 包导入 Visual Studio 解决方案[重复]

    这个问题在这里已经有答案了 我的桌面上保存了一个 nuget 包文件 nupkg 我正在尝试将其纳入我的 Visual Studio 解决方案中 有谁知道如何做到这一点 请按照以下步骤操作 从 Visual Studio 打开项目的解决方案
  • 为什么 -O3 GCC Optimization 没有内联这个函数?

    在GCC编译器中 每当标记 O3时 编译器主要通过循环展开和函数内联进行优化 但是 当我编译具有以下函数的应用程序时 它没有执行函数内联 从 gprofing 和 gconving 中我可以注意到这个函数 comp t delay 不是从这
  • 如何使用默认的 Android 绘图

    使用默认 Android 可绘制对象时的最佳方法是什么 我应该使用android R drawable或者我应该复制项目中的可绘制对象并使用R drawable 在较新版本的 Android 中 某些默认可绘制对象被删除或调整大小是否存在任
  • 与主题属性的数据绑定

    我正在尝试新的 Android数据绑定库 https developer android com tools data binding guide html我想使用绑定设置工具栏的背景颜色 默认情况下 颜色应为 colorPrimary 来
  • 使用GCC编译时还需要使用-fPIC吗?

    在 gcc 目标机器上 当想要编译共享库时 需要指定 fpic 或 fPIC 才能正确工作 这是因为默认情况下使用绝对寻址 这适用于完全控制自己的地址空间的可执行文件 但不适用于共享库 共享库可以加载到可执行文件地址空间中的任何位置 然而
  • MVC / ASP.Net 记录级授权最佳实践

    有人对在 ASP Net MVC 网站中执行记录级授权同时保持关注点分离的好方法有什么建议吗 使用PrincipalPermission 您可以使用以下方法修饰方法 PrincipalPermission SecurityAction De