假设我有一个控制器,其中有100个ActionResult,如下所示
public class BasicController : Controller
{
public ActionResult Apple1()
{
}
public ActionResult Apple2()
{
}
.
.
.
public ActionResult Apple100()
{
}
public ActionResult Mango1()
{
}
public ActionResult Mango2()
{
}
.
.
.
public ActionResult Mango100()
{
}
}
现在如何将[授权(角色=" AppleAdmin")]仅设置为Apple命名方法和[授权(角色=" MangoAdmin")]芒果命名方法?
我知道我们可以通过单独装饰每个ActionResult来实现。但我想知道的是,有没有办法set the Authorize to a Group
一次ActionResults。所以这使我在上面的场景中只使用了Authorize属性两次。
答案 0 :(得分:3)
假设清理控制器不是一个选项,我能想到的唯一答案是控制器上的自定义AuthorizeAttribute
。
如果您覆盖OnAuthorization
方法,则可以检查操作名称AuthorizationContext
}的filterContext.ActionDescriptor.ActionName
参数,如果逻辑失败则设置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();
}
}
}
然后
[AppleMangoAttribute]
public class BasicController : Controller
{
public ActionResult Apple1()
{
}
}
答案 1 :(得分:0)
我会将控制器分为2个类,只需修改路由,即可通过相同的路径访问2个控制器。
注意:我个人没有测试过这个解决方案是否会导致路由崩溃,但这是我能想到的最好的解决方案:
[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()
{
}
}