自定义授权过滤器如何处理角色?

时间:2020-07-15 14:50:03

标签: c# asp.net-mvc asp.net-core action-filter

我已经在ASP.NET Core 2.2 MVC中创建了一个自定义授权过滤器,以便处理常规请求和AJAX请求,并在用户未被授权的情况下重定向到自定义URL。

在某些控制器动作中,我设置了过滤器集[CustomAuthorize(Roles = "ExampleRole")]。由于我创建了自定义授权过滤器,因此我认为我还需要编写逻辑来检查角色声明。但是,CustomAuthorize过滤器能够正确处理角色,而无需任何其他代码。

这是怎么回事?自定义AuthorizeAttribute方法运行后,继续从OnAuthorization类继承的其他代码继续运行吗?

自定义授权过滤器的代码:

public class CustomAuthorize : AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        string redirectUrl = "/Auth/Login";

        if (context.HttpContext.User.Identity.IsAuthenticated == false)
        {
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                context.HttpContext.Response.StatusCode = 401;

                //result is returned to AJAX call and user is redirected to sign in page
                JsonResult jsonResult = new JsonResult(new { message = "Unauthorized", redirectUrl = redirectUrl });
                context.Result = jsonResult;
            }
            else
            {
                context.Result = new RedirectResult(redirectUrl);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

当您继承AuthorizeAttribute时,您自然会覆盖IAuthorizeData接口。当项目启动时,实现IAuthorizeData接口的属性将通过AuthorizationApplicationModelProvider转换为相应的过滤器。关于2.x,可以在此代码https://github.com/dotnet/aspnetcore/blob/2.1.3/src/Mvc/Mvc.Core/src/ApplicationModels/AuthorizationApplicationModelProvider.cs中查看其转换过程。 然后,将其授权规则传递到过滤器。