如何在控制器和操作级别使用Authorize属性?

rle*_*ias 6 c# security asp.net-mvc

我已经实现了自己的自定义Authorize属性.

该属性既适用于控制器级别,也适用于操作级别.

这是我需要做的一个例子:

[ClaimsAuthorize(Roles = "AdvancedUsers")]
public class SecurityController : Controller
{
    [ClaimsAuthorize(Roles = "Administrators")]
    public ActionResult AdministrativeTask()
    {
        return View();
    }

    public ActionResult SomeOtherAction()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,如果用户具有管理员角色但不具有AdvancedUsers角色,则他无法执行"管理任务".

即使用户未在控制器级别授权,如何更改此行为以在操作级别执行安全检查?

目前,我能想到的唯一解决方案是实现2个属性:一个用于保护控制器,另一个用于保护操作.然后我将使用Order属性首先在动作级别执行一个.

但是,如果可能的话,我更喜欢具有单个属性的解决方案.

Csa*_*oth 8

使用内置[OverrideAuthorization]

[ClaimsAuthorize(Roles = "AdvancedUsers")]
public class SecurityController : Controller
{
    [OverrideAuthorization]
    [ClaimsAuthorize(Roles = "Administrators")]
    public ActionResult AdministrativeTask()
    {
        return View();
    }

    public ActionResult SomeOtherAction()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

OverrideAuthorization属性可用于 MVC 5(至少)及更高版本。一旦你装饰Action用它,也装点新Role,并且将接管效果Controller级别的角色。


Sur*_*ngh 2

要限制特定操作,您只需在处理这些操作的方法上使用授权属性即可。当您使用 Authorize 属性标记操作方法时,对该操作方法的访问仅限于经过身份验证和授权的用户。

     //[ClaimsAuthorize(Roles = "AdvancedUsers")]
     public class SecurityController : Controller
     {

        {
        [ClaimsAuthorize(Roles ="Administrators", "Role2","Role3")]
        public ActionResult AdministrativeTask()
        {
            return View();
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者您可以在控制器级别覆盖您的授权,创建一个新OverrideAuthorizeAttribute属性。

public class OverrideAuthorizeAttribute : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此属性来覆盖您的控制器级别授权。

[ClaimsAuthorize(Roles = "AdvancedUsers")]
public class SecurityController : Controller
{
    [ClaimsAuthorize(Roles = "Administrators")]
    public ActionResult AdministrativeTask()
    {
        return View();
    }
     [OverrideAuthorizeAttribute(Roles ="xxxx")] // This role will override controller                   
                                                  //level authorization 
    public ActionResult SomeOtherAction()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)