【问题标题】:Partial controller with different attributes in ASP.NET MVCASP.NET MVC 中具有不同属性的部分控制器
【发布时间】:2017-08-26 12:41:45
【问题描述】:

假设我有一个控制器,它具有到某种角色的路由和其他角色的其他路由器。我想让代码更清晰地将这些路由分成部分类。我知道我能做到。

但我想知道我是否可以这样做:

[Authorize(Roles = "Admin")]
[MyLogger]
public partial class TheController{
     // Admin routes
}

[Authorize(Roles = "OtherRole")]
public partial class TheController{
     // Other routes that require auth
}

[AllowAnonymous]
public partial class TheController{
     // public routes
}

并且每个分部类中的路由仅获取该分部类的属性。

有可能吗?

【问题讨论】:

  • 我假设你想要的是区域 - 参考Organizing an Application using Areas
  • 我看了链接,但如果我理解得很好,创建不同的控制器没有区别。使用区域,网址也会发生变化,对吗? PS这是一项宁静的服务,我没有意见。我的情况是,我已经在生产中拥有所有这些路线,并且正在重新组织代码以轻松更改这些路线组的属性,所以我不想更改任何 url
  • 您无法通过拥有多个与您显示的名称相同的控制器来做到这一点
  • 我明白了 :( ...你有什么其他方法可以做我想做的事吗?
  • 您可以创建多个具有不同名称的控制器,然后添加路由以保持不同控制器之间的 URL 一致。我理解您的初衷,但是(即使它按预期工作)它增加了在安全方面犯错误的可能性(例如,如果您或未来的开发人员不理解/不记得它是如何工作的)。

标签: c# asp.net-mvc


【解决方案1】:

在您的示例中,只有一个类 TheController 具有两个属性。最好的方法是让两条路由和一个路由约束不绑定到任何允许基于角色的一个或另一个的参数。

【讨论】:

    【解决方案2】:

    我知道这是旧的,但您可以选择将 AuthorizeAttribute 添加到控制器拥有的每个单独的公共方法中。有点繁琐,因为每个方法都需要一个属性,但它可以实现你想要的。

    或者,您可以创建具有适当属性的内部控制器/服务,并让您的主“TheController”将调用转发给这些。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2010-11-13
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多