将 Func 作为属性参数传递以保护 MVC 路由

2023-12-24

我正在尝试保护满足一组条件的一组用户的 MVC 路由。由于 MVC 似乎大量使用属性,而 Steven Sanderson 在他的专业 MVC 书中使用了一个属性来实现安全可扩展性,因此我开始沿着这条路线走下去,但我想根据我所应用的操作来根据上下文定义规则。

有些行动仅适用于员工,有些则不然。

有些操作仅适用于 company1,有些则不然。

所以我在想这种用法......

[DisableAccess(BlockUsersWhere = u => u.Company != "Acme")]
public ActionResult AcmeOnlyAction()
{
...
}

[DisableAccess(BlockUsersWhere = u => u.IsEmployee == false)]
public ActionResult EmployeeOnlyAction()
{
...
}

对我来说看起来很干净并且确实很容易实现,但是我收到以下编译器错误:

“BlockUsersWhere”不是有效的命名属性参数,因为它不是有效的属性参数类型

显然你不能使用 Func 作为属性参数。还有其他建议来解决这个问题,或者提供我们在 MVC 项目中喜欢的简单用法的其他建议吗?


Necros 的建议可行,但你必须援引他的建议SecurityGuard助手体内的每一个动作方法。

如果您仍然想使用基于声明性属性的方法(其优点是您可以将属性应用于整个控制器),您可以编写自己的方法授权属性 http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

public class CustomAuthorizeAttribute : AuthorizeAttribute {
    public bool EmployeeOnly { get; set; }
    private string _company;

    public string Company {
        get { return _company; }
        set { _company = value; }
    }


    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        return base.AuthorizeCore(httpContext) && MyAuthorizationCheck(httpContext);
    }

    private bool MyAuthorizationCheck(HttpContextBase httpContext) {
        IPrincipal user = httpContext.User;

        if (EmployeeOnly && !VerifyUserIsEmployee(user)) {
            return false;
        }

        if (!String.IsNullOrEmpty(Company) && !VerifyUserIsInCompany(user)) {
            return false;
        }

        return true;
    }

    private bool VerifyUserIsInCompany(IPrincipal user) {
        // your check here
    }

    private bool VerifyUserIsEmployee(IPrincipal user) {
        // your check here
    }
}

然后你可以按如下方式使用它

[CustomAuthorize(Company = "Acme")]   
public ActionResult AcmeOnlyAction()   
{   
...   
}   

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

将 Func 作为属性参数传递以保护 MVC 路由 的相关文章

  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 在Page_Load之前处理事件

    我有一个 ASP NET 网页 其中包含大量在页面的 Page Load 事件中处理的代码 我在页面上还有一个下拉框 应该使用新值重新加载页面 但我想在处理整个页面加载代码之前获取这个新值 我正在尝试了解 ASP NET 页面生命周期 我应
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • ASP.NET MVC - 用于管理的区域还是单独的 Web 应用程序?

    到目前为止我一直在使用MVC Area为了行政我的 mvc 应用程序的一部分 但最近我开始重新思考这个问题由于每个应用程序不能有多个表单身份验证配置 这已经成为一个问题 因为在最近的一个项目中 我想将身份验证 cookie 设置为不会对用户
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何对使用 Controller.User 变量的控制器操作进行单元测试?

    我有一个控制器操作 如果用户已经登录 它会自动重定向到新页面 User Identity IsAuthenticated 针对这种情况编写单元测试以确保重定向发生的最佳方法是什么 我一直在使用以下 Mocks 和 Moq 来允许在我的单元测
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work

随机推荐

  • 如何添加排名栏?

    我想选择记录并确定每个相似数据的排名号 我的数据如下 MEMBER ID LOAN AMOUNT 1 2 000 00 2 1 000 00 3 4 000 00 4 1 000 00 我想要的结果如下所示 RANK MEMBER ID L
  • 使用 netlink API 设置无线通道

    我正在Ubuntu Linux 12 04环境中开发WiFi工具 我需要在不同通道之间切换WiFi接口 目前 我在 Wireshark 源代码 ws80211 utils c 中名为 ws80211 set freq 的函数中找到了解决方案
  • FPDF 错误:此文档(mine.pdf)可能使用了 FPDI 附带的免费解析器不支持的压缩技术[重复]

    这个问题在这里已经有答案了 如何解决问题 制作模板时 使用 PDF A 1a 导出设置将其导出 在 Acrobat Pro 中 您可以使用此设置另存为 更多详细信息 MAC OS X 但也应该适用于 WIN 在 acrobat pro 中打
  • Touchenter 和 touchleave 事件支持

    我读到了有关 touchenter 和 touchleave 事件的信息 位于莫兹拉网站 https developer mozilla org en US docs Web API TouchEvent and w3网站 http www
  • 如何在 PHP 中设置深度数组

    假设我有以下功能 function setArray array key value array key value 上面的函数中 key只在第一层 如果我想在第二层或第三层设置key 如何重写函数 e g array foo bar te
  • 如何查看初始化权重(即训练前)?

    我正在使用 Keras 生成一个简单的单层前馈网络 当通过以下方式初始化权重时 我想更好地处理权重的值kernel initializer争论 有没有办法可以在初始化后 即训练完成之前 查看权重值 只需使用get weights 在模型上
  • 包含字符串文字的文档测试

    我有一个单元测试 我想为一个将 XML 作为字符串的函数编写 这是一个文档测试 我希望 XML 与测试一致 由于 XML 是多行的 我在文档测试中尝试了字符串文字 但没有成功 这是简化的测试代码 def test gt gt gt conf
  • Excel VBA 合并/组合具有相同名称的列

    我的项目工作存在类似于下面描述的问题 My dataset is like this What I want is like this LAST COLUMN 我拥有的是许多同名的列 例如 Is paid Job 我想要的是创建一个新列 T
  • 数据库不存在错误

    当我进行数据库备份时 出现数据库不存在的错误 但我可以正常附加数据库 并且其他进程 例如数据插入和更新 工作正常 但是当我进行数据库备份时 出现以下错误 我显示了错误屏幕截图和备份按钮代码 string cnstr Data Source
  • PHP 服务器发送事件连接不会关闭?

    我已经实施了一个服务器发送事件 https developer mozilla org en US docs Web API Server sent events with 事件源 https developer mozilla org e
  • 从函数返回包含单个项目的元组

    刚刚在 Python 中遇到了一点奇怪的地方 我想我应该记录它在这里将其写为一个问题 以防其他人试图使用与我相同的徒劳搜索词来找到答案 看起来元组解包可以做到这一点 因此如果您希望迭代返回值 则无法返回长度为 1 的元组 虽然看起来外表是骗
  • 添加 spring-data-jpa 架构引用后 Spring 配置 xml 无效

    启动 spring 上下文时出现以下异常 java lang Exception java lang IllegalStateException ContainerBase addChild start org apache catalin
  • 错误:(参数类型“String?”无法分配给参数类型“String”,因为“String?”可以为空,而“String”则不能。)在Flutter中

    我是 flutter 的新手 在传递字符串时遇到错误 并到处查找 最后将其添加到 StackOverflow 中 错误是 Error The argument type String can t be assigned to the par
  • Node js函数返回[object Object]而不是字符串值

    我对 java 脚本和 Node js 很陌生 我试图从 MySQL DB 获取一个值 返回值是 object Object 而不是字符串 我在网上没有找到任何答案 这是什么问题 我希望这里有人能提供帮助 行值为 object Object
  • MKAnnotationView 的子类

    我想知道是否有人知道 MKAnnotationView 类的任何子类 在苹果文档中 他们说一个例子是 MKPinAnnotationView 所以我想知道是否还有其他预先创建的子类 例如用于跟踪设备当前位置的子类 如果有人有关于创建我自己的
  • 如何反序列化 C# 对象中的嵌套 xml

    我正在使用 silverlight 来实现 xml 的反序列化 如下所示 字符串 xmlString
  • 在 Activity 开始之前访问 Activity

    我正在使用 Instrumentation TestCase 类来对活动中的某些内容进行单元测试 在启动此活动之前 我需要能够检查 SharedPreferences 的内容并编辑它们 我无法使用 setUp 方法创建 Activity 并
  • 如何在 Lucene 中存储多种不同类型的文档

    我有一个现有的 Lucene 存储 其中包含数百万个文档 每个文档都代表一个实体的元数据 我有几个 Id 字段 Id1 Id2 Id5 每个文档可以有零个或多个该字段的值 一次只能由这些 Id 之一查询该索引 我已经独立地对这些字段建立了索
  • UIButton 渐变不起作用

    我从教程中找到了这段代码并尝试使用它 CAGradientLayer btnGradient CAGradientLayer layer btnGradient frame button bounds btnGradient colors
  • 将 Func 作为属性参数传递以保护 MVC 路由

    我正在尝试保护满足一组条件的一组用户的 MVC 路由 由于 MVC 似乎大量使用属性 而 Steven Sanderson 在他的专业 MVC 书中使用了一个属性来实现安全可扩展性 因此我开始沿着这条路线走下去 但我想根据我所应用的操作来根