注入具有授权属性的服务过滤器时如何处理角色?

时间:2020-09-04 14:09:27

标签: c# asp.net-mvc asp.net-core authorize-attribute asp.net-roles

我正在使用ASP.NET Core 2.2,并且有一个名为Authorize的自定义CustomAuthorize属性过滤器,用于处理身份验证和授权。身份验证部分由我在OnAuthorization函数中编写的一些代码手动处理,授权部分由AuthorizeAttribute类继承的CustomAuthorize类中的任何代码处理来自。

我希望能够将多个服务注入我的CustomAuthorize过滤器中,以便通过将用户角色与Role声明中的角色进行比较来验证数据库中用户的角色是否已更改。我发现注入服务的方法是使用ServiceFilterAttribute。当我像这样将ServiceFilter应用于CustomAuthorize属性时:

enter image description here

我收到错误The name 'Roles' does not exist in the current context。我了解ServiceFilter不能接受该类型的构造函数参数(即TypeFilter's工作),但是Role只是AuthorizeAttribute类的一个属性,如您所见下方:

enter image description here

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);
                }
            }
        }
    }

0 个答案:

没有答案