我已经在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);
}
}
}
}
答案 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中查看其转换过程。 然后,将其授权规则传递到过滤器。