使用授权过滤器区分控制器操作

2023-12-10

我想要 4 个具有相同名称的操作(控制器方法可能有不同的名称,但它们的名称相同)ActionName()它们的属性对于所有 4 个都是相同的:

[ActionName("Same-name")]
public ActionResult AnonAction() { ... }

[HttpPost]
[ActionName("Same-name")]
public ActionResult AnonAction(ModelData data) { ... }

[Authorize]
[ActionName("Same-name")]
public ActionResult AuthAction() { ... }

[HttpPost]
[Authorize]
[ActionName("Same-name")]
public ActionResult AuthAction(OtherData data) { ... }

当用户时,第一对夫妇做了一些事情are not经过身份验证(匿名用户)。当用户are已验证。

前三种操作方法按预期工作,但我似乎无法使最后一种方法工作。它抛出一个异常,告诉我它无法区分 POST 操作。我不认为我在这里做错了什么或忘记做某事。我只是希望这不是 Asp.net MVC 2 RC2 中的错误。

有人看出我的行为有什么缺陷吗?


@Paco是对的。AuthorizeAttribute与动作选择无关。他的建议感觉不对,所以感谢他,我深入研究了 MVC 代码,并自己想出了最合适的解决方案。

解决方案本来就是这样的

MVC 中的这些东西有一个可扩展点。基本上你要做的就是写你自己的ActionMethodSelectionAttribute这将处理这个问题。我创建了一个根据用户授权(匿名或授权)选择操作的方法。这是代码:

/// <summary>
/// Attribute restricts controller action execution only to either anonymous or authenticated users
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class AllowAuthenticatedAttribute : ActionMethodSelectorAttribute
{
    /// <summary>
    /// Gets or sets a value indicating whether this <see cref="AllowAuthorizedAttribute"/> allows authenticated or anonymous users to execute decorated controller action.
    /// </summary>
    /// <value><c>true</c> if authenticated users are allowed to execute the action; <c>false</c> if anonymous users are allowed to execute the action.</value>
    public bool Authenticated { get; set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="AllowAuthorizedAttribute"/> class.
    /// </summary>
    /// <param name="authenticated">If set to <c>true</c> only authorized users will be able to access this action.</param>
    public AllowAuthenticatedAttribute(bool authenticated)
    {
        this.Authenticated = authenticated;
    }

    /// <summary>
    /// Determines whether the action method selection is valid for the specified controller context.
    /// </summary>
    /// <param name="controllerContext">The controller context.</param>
    /// <param name="methodInfo">Information about the action method.</param>
    /// <returns>
    /// true if the action method selection is valid for the specified controller context; otherwise, false.
    /// </returns>
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        return this.Authenticated == controllerContext.HttpContext.User.Identity.IsAuthenticated;
    }
}

额外观察

当我用自定义属性装饰我的操作方法时,我仍然遇到相同的异常,直到我添加[HttpGet]到我的 GET 操作。这是为什么?我在流程图中找到了答案专业 ASP.NET MVC 框架 book (你自己检查一下)。抛出异常是因为有不止一个操作方法ActionMethodSelectorAttribute。通常我们只装饰 POST 操作,但在这种情况下,所有这些操作都被装饰了。 2 个用于匿名用户,2 个用于经过身份验证的用户。这就是为什么你必须同时使用HttpGet and HttpPost关于行动方法当您向它们添加更多选择器属性时。

我的控制器操作现在看起来像这样

[HttpGet]
[AllowAuthenticated(false)]
[ActionName("Same-name")]
public ActionResult AnonAction() { ... }

[HttpPost]
[AllowAuthenticated(false)]
[ActionName("Same-name")]
public ActionResult AnonAction(ModelData data) { ... }

[HttpGet]
[Authorize]
[AllowAuthenticated(true)]
[ActionName("Same-name")]
public ActionResult AuthAction() { ... }

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

使用授权过滤器区分控制器操作 的相关文章

随机推荐

  • pyplot.show() 重新打开旧的 tkinter 对话框

    编辑 这似乎是 Mac OS 系统上仅限于 Tcl Tk 的问题 因此 如果您没有这方面的经验 这个话题可能没有意义 None
  • pentaho Spoon/pid:如何每次将文件移动到不同名称的文件夹?

    我每个月都会有新的文本文件 从中提取数据并进行一些转换 在每个月底 我需要将这些文件移动到名称为当前日期的文件夹中 这意味着 目标文件夹的名称每次都不同 我之前迈出了一步move files创建一个文件夹 其名称为当前日期 exp 2019
  • 将 uint8_t 数据与字符串进行比较

    这听起来可能有点奇怪 或者问题可能是一个微不足道的问题 但在我一生的大部分时间里 我都在使用 PHP 编程 是的 我知道这听起来如何 所以当我转向 C 时 有些东西对我来说非常陌生 由于 php 习惯 所以我使用 struct 加载 wav
  • 如何从用户输入中打印单个单词

    如何从java中的用户输入中打印出单个单词 例子 用户输入 我们爱妈妈 她是最好的 该程序假设打印 mom 因为第一个和最后一个字符是相同的 我的代码最后没有打印任何内容 这是我的代码 Scanner s new Scanner Syste
  • 如何将 javascript (js) Map 传递给 Spring Boot Controller?

    我有一个包含键值对的 Java 脚本映射 我需要将其发送到 spring boot 控制器 例子 var myMap new Map myMap set 1 value1 myMap set 2 value2 我无法在 Spring Boo
  • 如何为暴露多个端口的服务配置 Istio 的虚拟服务?

    我有一个暴露多个端口的容器 因此 为部署配置的 kubernetes 服务如下所示 kind Service apiVersion v1 metadata name myapp labels app myapp spec selector
  • Angular 2 AOT 不像我的组件中的 moduleId

    我该如何解决这个问题 据我所知 JIT 需要组件上的 moduleId 来查找模板和样式 如果组件有 但是 AOT 不使用模块 并且在编译 AOT 时会出现 找不到名称 模块 错误 我不想检查所有模块并删除 AOT 的 Id 因为我仅使用
  • 在 Lucene 中使用 WikipediaTokenizer 的示例

    我想在 lucene 项目中使用 WikipediaTokenizer http lucene apache org java 3 0 2 api contrib wikipedia org apache lucene wikipedia
  • 定位已检查输入的标签

    如果我有一个包含在标签内的无线电输入 那么在检查输入时如何定位标签 div p Payment Plan p div
  • 如何对包含 R 函数的 pyspark RDD 进行分区

    import rpy2 robjects as robjects dffunc sc parallelize 0 robjects r rnorm 1 robjects r runif dffunc collect Outputs 0
  • Eigen 中三元运算符的类型错误

    我正在用 C 编写一个类来概括两个稀疏矩阵求解器 SparseLU 和 Sparse Cholesky 当我尝试使用三元运算符时 它说操作数类型不兼容 但如果我使用 If 语句 代码就会编译 错误 2 错误 操作数类型不兼容 const E
  • FopFactory.newInstance() 时出现 Fop 异常

    我正在使用 struts 2 并且尝试使用 fop 从 xml 和 xsl 创建 pdf 文件 我在这两个网址的基础上开发我的代码http svn apache org viewvc xmlgraphics fop trunk exampl
  • 可观察链表

    在我的 WPF 应用程序中 我有一个 ItemsControl 其项目值取决于前一个项目显示的 ViewModel 是一个音频文件 分为可变长度的部分 我需要以这种方式显示它 右侧显示日期时间 这就是我需要计算的内容 我只知道每个部分的长度
  • 当 Kubernetes 中的 configmap 更新时重新启动 Pod?

    当配置映射更改 更新时 如何自动重新启动 Kubernetes Pod 和与部署关联的 Pod 我知道有人在讨论当配置映射更改时自动重新启动 Pod 的能力 但据我所知 这在 Kubernetes 1 2 中尚不可用 所以 我认为 我想做的
  • 在powerpoint vba中更改图表的数据源

    我在 PowerPoint 中有一个条形图 想要选择行 类别 1 4 请参阅屏幕截图1 取决于我在组合框中的选择 到目前为止 这是我的代码 Private Sub ComboBox1 Change With SlideShowWindows
  • Php.Advance周历一周[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中获取下一个 上一个 ISO 周和年份 我正在尝试编写一个脚本 该脚本将在表格中显示一周中的几天 并且如果单击按钮 该脚本将前进一周 我设法让它一直工作到年底 然后日期就全部出错了 他就是
  • 在 PHP 中使用聚合方法和新的 MongoDB 驱动程序类

    我是蒙戈新手 我尝试获取文档的子文档 这是我的文档 id ObjectId 5900ab35c720b210c000032c name B 1 providers id ObjectId 59030550c720b211dc005e9e n
  • 在线性时间和常量空间中查找数组中缺失和重复的元素

    给你一个数组N64 位整数 N可能非常大 您知道每个整数 1 N 在数组中都会出现一次 除了有一个整数缺失和一个整数重复 编写一个线性时间算法来查找丢失和重复的数字 此外 您的算法应该在较小的恒定空间中运行 并且保持数组不变 Source
  • 如何使用 ggplot2 在一组美国县周围创建边界?

    我对使用 R 比较陌生 我正在尝试使用数据来创建美国各州的地图 以勾勒出某些区域的轮廓并为其着色 我正在尝试用黑色显示一个州及其县 除此之外 我想在县组周围创建粗红色边框 并根据我拥有的一些数据对一些县进行颜色填充 本质上我想结合这两个图像
  • 使用授权过滤器区分控制器操作

    我想要 4 个具有相同名称的操作 控制器方法可能有不同的名称 但它们的名称相同 ActionName 它们的属性对于所有 4 个都是相同的 ActionName Same name public ActionResult AnonActio