C# 如何将[Authorize]属性仅设置为控制器内的一组ActionResults
假设我有一个控制器,有100个ActionResult,如下所示C# 如何将[Authorize]属性仅设置为控制器内的一组ActionResults,c#,asp.net,asp.net-mvc,asp.net-mvc-5.2,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5.2,假设我有一个控制器,有100个ActionResult,如下所示 public class BasicController : Controller { public ActionResult Apple1() { } public ActionResult Apple2() { } . . . public ActionResult Apple100() {
public class BasicController : Controller
{
public ActionResult Apple1()
{
}
public ActionResult Apple2()
{
}
.
.
.
public ActionResult Apple100()
{
}
public ActionResult Mango1()
{
}
public ActionResult Mango2()
{
}
.
.
.
public ActionResult Mango100()
{
}
}
现在,我如何将[Authorize(Role=“AppleAdmin”)]设置为仅使用苹果命名的方法和[Authorize(Role=“MangoAdmin”)]芒果命名的方法
我知道我们可以通过单独装饰每个ActionResult来实现。但是我想知道的是,有没有一种方法可以将Authorize设置为一组ActionResults。因此,在上述场景中,我只能使用Authorize属性两次。假设清理控制器不是一个选项,我能想到的唯一答案是在控制器上自定义
AuthorizeAttribute
。
如果重写了授权方法,则可以检查操作名称(filterContext.ActionDescriptor.ActionName
)的AuthorizationContext
参数,并在逻辑失败时设置filterContext.Result=new HttpUnauthorizedResult
差不多
public class AppleMangoAuthorizeAttribute : AuthorizeAttibute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.ActionDescriptor.ActionName.Contains("Apple") /*&& some other failing logic*/)
{
filterContext.Result = new HttpUnauthorizedResult();
}
else if (/*same for mango*/)
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
然后
我将控制器分为两个类,只需修改路由即可通过相同的路由访问这两个控制器 注意:就个人而言,我还没有测试此解决方案是否会使路由崩溃,但这是我能想到的最好的解决方案:
[Authorize(Role="AppleAdmin")]
[Route("BasicController")]
public class BasicControllerApple : Controller
{
public ActionResult Apple1()
{
}
}
[Authorize(Role="MangoAdmin")]
[Route("BasicController")]
public partial class BasicControllerMango : Controller
{
public ActionResult Mango1()
{
}
}
在这里使用属性可能不是最好的解决方案(控制器有数百个操作,这在任何情况下都是奇怪的),也许你可以设置一个全局操作过滤器,让它根据约定执行一些逻辑。问题是它是一个报告控制器,大约有30多个报告。我需要限制只有一个角色类型的少数和所有的管理员。我该怎么做呢?我现在有一个解决方案,为一个特定类型的报告提供一个通用的登陆方法,授权它可以解决这个问题。但我只是想知道是否存在类似组授权的情况,将Apple和Mango分为两个单独的控制器并装饰控制器不是更好吗?@Reddy我的意思是,您可以编写一个自定义授权属性,使用反射来检查方法名是否包含Apple或Mango,然后检查用户是否正确允许……但这是一种黑客行为,解决办法是将它们分开。@Reddy我只是对所有内容感兴趣:)谢谢,但我的问题更多的是针对不同的方法(与类似的开始名称无关,只是为了便于理解OP),将它们同时分组在同一授权属性下。此解决方案确实解决了发布的问题。但我想我应该用不同的方法名。那么,如果方法名称不相似,如何解决这个问题呢?这很公平。尽管如此,请看一下
授权上下文提供了什么,您可能仍然能够按照需要的方式进行筛选。
[Authorize(Role="AppleAdmin")]
[Route("BasicController")]
public class BasicControllerApple : Controller
{
public ActionResult Apple1()
{
}
}
[Authorize(Role="MangoAdmin")]
[Route("BasicController")]
public partial class BasicControllerMango : Controller
{
public ActionResult Mango1()
{
}
}