Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将[Authorize]属性仅设置为控制器内的一组ActionResults_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 5.2 - Fatal编程技术网

C# 如何将[Authorize]属性仅设置为控制器内的一组ActionResults

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() {

假设我有一个控制器,有100个ActionResult,如下所示

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() 
        {
        }
    }