有关使用重写的 AuthorizeAttribute、线程安全、ChildActions 和缓存的 MVC3 自定义安全设置的问题

2024-01-01

因此,在为我的 MVC3 应用程序寻找强大的安全解决方案后,我遇到了这篇博文 http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx作者:里克·安德森。它详细介绍了一种白名单方法,其中将 AuthorizeAttribute 的自定义实现用作全局过滤器,并且您使用虚拟属性AllowAnonymousAttribute 装饰您希望允许匿名访问的操作/控制器(我说虚拟属性是因为AllowAnonymousAttribute 内部没有逻辑,它是只是一个空属性类)

bool allowAnnonymous = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);
if (allowAnnonymous) return;

这(以及他的博客上提到的其他安全建议,如 HTTPS)为我提供了一个安全的默认模型,这样我就不必对每个操作应用安全检查,并且记住将其添加到未来的功能添加中。

问题的第一部分

现在,我没有在 AuthorizeAttribute 上使用用户/角色属性,我需要从数据库中获取这些内容。对我来说,这就是 AuthorizeCore 中的内容,因为它的唯一责任是返回 true false,用户是否有权访问。但是我有一个问题,根据我对 AuthorizeAttribute 类源代码的阅读,AuthorizeCore 必须是线程安全的,并且我不确定访问数据库以确定用户权限并遵守该权限的最佳方法。我的应用程序正在使用 IoC,并且当前让我的 IoC 容器将处理所有这些内容的存储库注入到 AuthorizeAttribute 的构造函数中,但是通过执行此操作然后在 AuthorizeCore 中访问它,我是否不会造成线程安全问题?或者,IoC 实现和我用来向自定义 AuthorizeAttribute 构造函数提供参数的 MVC3 DependencyResolver 是否能够充分处理线程安全?请注意,我的存储库使用 UnitOfWork 模式,其中包括我的 nHibernate SessionFactory 作为存储库的构造函数,并且工作单元类是从我的 IoC 容器提供的,由 StructureMap 使用下面的行实现,我对此处使用的范围的看法是否正确会处理线程问题吗?

For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();

问题的第二部分

我的数据模型(以及安全模型)是这样设置的,以便我的主要业务对象全部定义为一个大型层次结构模型,当我检查权限时,我会在该层次结构模型中查找用户帐户所在的位置定义并默认授予对其下所有内容的访问权限。 辅助权限检查是使用管理定义的业务逻辑权限的检查,例如角色 X 中的用户是否可以访问“删除小部件”功能。为此,我使用路由数据并提取控制器和操作名称,并将它们与当前用户主体详细信息中的详细信息结合使用,以访问我的数据库来解析此请求的权限。然而,对于页面上使用的每个 ChildAction 也会重复此逻辑,但因为我使用的是 Route 数据中的 Controller 和 Action 名称,所以我实际上并未获取 Child Action 信息。它保留为父操作名称,而不是子操作名称,因为子操作不是通过 URL 请求执行的。这会导致对我的数据库进行冗余安全检查,以获取父操作的详细信息和不必要的资源命中。在研究这个问题时,我决定简单地绕过子操作的安全检查,并依赖父操作来实现这一点。

bool bypassChildAction = filterContext.ActionDescriptor.IsDefined(typeof (ChildActionOnlyAttribute), true) || filterContext.IsChildAction;
if (bypassChildAction) return;

这样做有意义吗?如果有/没有,为什么?在我看来,如果 Action 用 ChildActionOnlyAttribute 修饰,则无论如何都无法通过 URL 公开访问它。如果它作为子操作执行但不完全是子操作,我可以绕过此执行的安全检查,因为父操作将处理权限。您是否曾经遇到过需要限制对子操作的访问的情况?知道子操作通常是非常小的部分视图,我预计这不会成为问题,但我也看到 OnAuthorization 的默认实现中引用了一行,概述了有关缓存的一些问题。有谁知道这是否会影响我提出的解决方案?

总结关注点:

  • 多线程问题 访问用户权限 AuthorizeCore 内的数据库
  • 绕过的安全问题 子操作的授权检查
  • 缓存子操作的问题 与上一点相结合

任何有关这些方面的意见或帮助将不胜感激!


Heya Yarx - 第 1 部分 - 缓存用户登录时的所有权限。 那么多线程访问就不是问题了,因为您的 AuthorizeCore 只是从缓存中获取角色,此时可以将其视为只读。

第2部分: 再次回到上面的第 1 点:) - 如果您的安全检查如此严格,为什么不在登录时加载用户的所有权限并缓存它们。点击子操作后,您可以请求权限,然后检查它们的缓存。

肯定有一种更好的方法来处理这个问题,而且不会那么重。如果您在一次请求中多次访问数据库只是为了获取权限,则需要通过某种机制(自定义或实现另一个基于声明的系统等)缓存您的权限集

不过,我并没有 100% 遵循您的基于路线的授权机制。您提到您正在从路线中提取信息 - 您能在这里举个例子吗?

保护您孩子的行为绝对有意义。如果两个视图调用 Html.Action - 一个专门作为管理员,另一个被错误地复制并粘贴到另一个视图中,该怎么办?您的子操作应该始终受到保护,不要认为它们没问题,因为它们只是从另一个视图调用的。

此外,如果您无法缓存用户的整个树,您当然可以在第一次调用 AuthorizeCore 时缓存安全检查。后续调用将简单地检查 ex。缓存角色 - 如果存在则使用它们,否则查看数据库。

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

有关使用重写的 AuthorizeAttribute、线程安全、ChildActions 和缓存的 MVC3 自定义安全设置的问题 的相关文章

  • 如何在 ASP.NET MVC 5 中实现简单的身份验证

    我有一个带有 SQL Server 数据库的现有项目 带有数据库优先的 EF 工作单元和服务层 我需要添加 ASP NET MVC 项目并使用现有服务来验证用户身份 我发现了不同的复杂决定 我需要在身份中使用我的服务或在没有身份的情况下实现
  • 为什么我的 ITexthandler 不工作?我正在尝试将 XML 解析为 ITextSharp 文档

    我正在使用 Visual Developer 2010 MVC 3 c 我正在尝试将 XML 解析为 iTextSharp 文档 如下所示 ITextHandler textHandler new ITextHandler doc text
  • 如何在 MVC Core 中动态选择控制器

    我遇到的情况是 站点可能需要链接来根据数据库结果重定向到某些控制器 例如 site com abcd 需要从项目控制器返回结果 通常称为 item view 123 这里的关键是我不能将 abcd 硬编码到路由中 有些链接可能会转到项目控制
  • 合并 2 个 .jks 信任库文件

    我正在使用启用了 SSL 的 Tomcat 并使用信任库进行客户端身份验证 我有两个 jks trustore 文件 第一个 我将其用于 PROD 环境 另一个用于 TEST 环境客户端证书 我在 Tomcat 上部署了 Web 应用程序
  • ASP.NET MVC 阻止用户直接访问 URL

    因此 我在 MVC 中创建了一个简单的 hello world 作为概念证明 索引视图列出了一些组成的记录 后面是典型的 编辑 详细信息 和 删除 操作链接 但是 根据哪个 AD 组拥有该记录 我不会呈现其中一些选项 举例来说 假设我要提取
  • 会话劫持和 PHP

    让我们只考虑服务器对用户的信任 会话固定 为了避免我使用的固定session regenerate id 仅在身份验证中 login php 会话侧劫持 整个站点的 SSL 加密 我安全吗 阅读 OWASPA3 破坏的身份验证和会话管理 h
  • 如何使用 LOCK ASM 前缀来读取值?

    我知道如何使用 LOCK 来线程安全地递增一个值 lock inc J 但是如何以线程安全的方式读取 J 或任何值 LOCK 前缀不能与 mov 一起使用 如果我执行以下操作 xor eax eax lock add eax J mov J
  • 通过 C# 更改 MS WORD

    我试图保存通过 C 打开的文档 我也保留了文档界面的 TrackRevision 属性 现在我想获取修改文档的人的姓名 在 MS Word 中 我可以从审阅窗格中找到更改文档的用户的姓名 我如何通过 C 获得它 之后一旦用户点击 MS Wo
  • 将有用的消息从一个控制器传递到另一个重定向的控制器

    我想在用户单击按钮后创建 RedirectToAction 在重定向之前 我将信息存储到变量中 最后 在我转向行动之后 我想展示一些有用的信息 我试过这个 ViewBag message User with ID id was change
  • 寻找在 Ruby on Rails 中构建安全 REST API 的建议

    我正开始为我正在从事的项目构建 REST API 这促使我对使用 RoR 构建 API 的最佳方法进行了一些研究 我很快发现 默认情况下 模型是向世界开放的 只需在 URL 末尾添加 xml 并传递适当的参数即可通过 URL 进行调用 那么
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • ASP.Net 使用状态服务器和缓存增加 MaxProcesses(网络花园)

    我在 IIS7 上有一个 ASP Net 网站 我计划增加 MaxProcesses 以匹配服务器上的核心数量 4 核心 64 位 Windows Server 2008 根据我的阅读 如果我增加 MaxProcesses 来创建一个网络花
  • 如何在 MVC3 中将附加列添加到 WebGrid

    我正在使用 WebGrid 帮助程序使网格在我的 MVC 应用程序中可排序 var grid new WebGrid Model canSort true grid GetHtml columns grid Columns grid Col
  • 表格不会提交

    我的 jquery mobile modernizr 网站上有一个表单 我正在使用 jquery mobile 的 1 1 0 rc 1 我的页面上有此表单 但它没有提交 单击搜索按钮绝对不会执行任何操作 我不知道为什么 有任何想法吗 p
  • 是否可以在 ApplicationServices DB 中对电子邮件地址进行加密?

    为了在我正在进行的项目中保持电子邮件地址的私密性 提高安全性 我希望对存储在数据库中的所有电子邮件进行加密 但是 我们使用的是 Asp Net Membership 提供程序 并且电子邮件以明文形式显示在表 aspnet Membershi
  • 如何在 Spring Security @PreAuthorize/@PostAuthorize 注解中使用自定义表达式

    有没有办法在 Preauthorize 块中创建更具表现力的语句 这是我发现自己重复的一个例子 因为 Preauthorize 开箱即用并不是非常智能 RequestMapping value id method RequestMethod
  • HTML 帮助器类方法不起作用

    我被 Steven Sanderson Adum Freeman Pro ASP Net MVC 3 的参考书困住了 我已经读到了第 185 页 其中使用 HTML 帮助程序返回链接中的页面编号 我在这个网站上找到了帮助解决我与这本参考书有
  • 为什么Asp.net MVC4不能使用SQL Server Session状态存储的cookieless

    全部 这是我在 Asp net MVC4 应用程序中的 Web 配置 我发现如果我将 cookieless 设置为 false 一切都会正常 但如果我不想使用 cookie 那么应用程序就无法工作 当我调试应用程序时 我发现控制器无法接收来
  • 使用 Laravel Intervention 库缓存动态图像不起作用

    我目前正在使用 Laravel 5 并利用干预图像集成 http image intervention io http image intervention io 我动态地使用它 因此图像具有如下 URL http example org
  • MVC 4 捆绑和缩小是否会进行缓存?

    我想使用 MVC4 的捆绑和模仿功能 但我担心模仿 是否每次客户端请求 css 和 javascript 时 捆绑 模拟过程都会起作用 如果是的话那不是每次都会有CPU开销吗 Quote http www asp net mvc tutor

随机推荐