我正在使用ASP.NET Core 2.2,并且有一个名为Authorize
的自定义CustomAuthorize
属性过滤器,用于处理身份验证和授权。身份验证部分由我在OnAuthorization
函数中编写的一些代码手动处理,授权部分由AuthorizeAttribute
类继承的CustomAuthorize
类中的任何代码处理来自。
我希望能够将多个服务注入我的CustomAuthorize
过滤器中,以便通过将用户角色与Role
声明中的角色进行比较来验证数据库中用户的角色是否已更改。我发现注入服务的方法是使用ServiceFilterAttribute。当我像这样将ServiceFilter
应用于CustomAuthorize
属性时:
我收到错误The name 'Roles' does not exist in the current context
。我了解ServiceFilter
不能接受该类型的构造函数参数(即TypeFilter's工作),但是Role
只是AuthorizeAttribute
类的一个属性,如您所见下方:
public class AuthorizeAttribute : Attribute, IAuthorizeData
{
public AuthorizeAttribute();
public AuthorizeAttribute(string policy);
public string Policy { get; set; }
public string Roles { get; set; }
public string AuthenticationSchemes { get; set; }
public string ActiveAuthenticationSchemes { get; set; }
}
那么,为什么不能为属性过滤器设置Roles
属性?我在这里误会什么?
我的CustomAuthorize
过滤器。我最终将拥有一个构造函数并将服务注入其中:
public class CustomAuthorize : AuthorizeAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
string redirectUrl = "/UserAccess/Index";
if (context.HttpContext.User.Identity.IsAuthenticated)
{
if (context.HttpContext.User.HasClaim(CustomClaimTypes.UserNotFound, true.ToString()))
{
context.Result = new RedirectResult("/UserAccess/NotAuthorized");
}
}
else
{
if (context.HttpContext.Request.IsAjaxRequest())
{
context.HttpContext.Response.StatusCode = 401;
JsonResult jsonResult = new JsonResult(new { redirectUrl = redirectUrl });
context.Result = jsonResult;
}
else
{
context.Result = new RedirectResult(redirectUrl);
}
}
}
}