Asp.Core Доступ атрибутов реквизита из пользовательского IAuthorizationHandler - PullRequest
0 голосов
/ 09 июля 2019

Есть ли способ получить доступ к свойствам пользовательских атрибутов из IAuthorizationHandler?

У меня есть атрибут авторизации

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public VipAuthorize VipAuthorize { get; set; } = VipAuthorize.Ignore;

    public CustomAuthorizeAttribute(VipAuthorize vipAuthorize, params 
        UserRoleEnum[] roles) : base()
    {
        Roles = string.Join(",", roles).ToUpper();
        VipAuthorize = VipAuthorize;
    }
    public CustomAuthorizeAttribute(params UserRoleEnum[] roles) : base()
    {
        Roles = string.Join(",", roles).ToUpper();
    }
}

Также у меня есть обработчик авторизации

public class CustomAuthorizationHandler : IAuthorizationHandler
{
    public Task HandleAsync(AuthorizationHandlerContext context)
    {
        if (context.Resource != null)
        {
            var httpContext = ((AuthorizationFilterContext)context.Resource).HttpContext;
            var distributedCache = (IDistributedCache)httpContext.RequestServices.GetService(typeof(IDistributedCache));
            var userIdentifier = context.User.Claims.FirstOrDefault(x => x.Type == GlobalData.CustomClaimNames.UserId);
            var userId = userIdentifier.Value;

            var userAuthCacheStr = distributedCache.GetString(GlobalData.CacheGlobalKeys.UserId(userId));
            var userQuickModelCahce = JsonConvert.DeserializeObject<UserQuickModelCache>(userAuthCacheStr);

            if (userQuickModelCahce.UserType == AuthUserType.Client && userQuickModelCahce.SubscriptionExpired)
            {
                context.Fail();
                throw new CustomException(GlobalData.Translations.Keys.SubscriptionExpired, HttpStatusCode.Redirect);
            }

            var roles = context.PendingRequirements.Where(x => x.GetType() == typeof(RolesAuthorizationRequirement))
                .SelectMany(x => ((RolesAuthorizationRequirement)x).AllowedRoles.Select(r => r.ToUpper())).ToList();

            if (roles?.Count > 0)
            {
                if (!roles.Contains("AnyRole"))
                {
                    context.Fail();
                    throw new CustomException(GlobalData.Translations.Keys.NotAuthorized, HttpStatusCode.Unauthorized);
                }
            }
        }

        context.Succeed(context.Requirements.FirstOrDefault());
        return Task.CompletedTask;
    }
}

В этом обработчике я хочу получить доступ к свойству VipAuthorize из CustomAuthorizeAttribute. Таким образом, я смогу игнорировать подтверждение пользователя vip там, где оно мне нужно.

Вот как я это использую:

[HttpPost]
[CustomAuthorize(VipAuthorize.Ignore, UserRoleEnum.Client)]
public async Task<IActionResult> Add()
{
    var item = await _accounttransactionService.Create();
    await _accounttransactionService.Commit();
    return Ok(item.ToDto<AccountTransactionDto>());
}

...