Можете ли вы использовать AuthorizationService от AuthorizationHandler в ASP. NET Core? - PullRequest
0 голосов
/ 26 марта 2020

Я довольно новичок в asp. net, и это мой первый вопрос о стекопереработке, поэтому, пожалуйста, go, не волнуйтесь.

У меня есть два обработчика авторизации для двух разных ресурсов. Доступ к данному ресурсу иногда зависит от доступа к другому ресурсу. Ради хорошей практики кодирования (то есть, не копируя один и тот же код в оба обработчика) и поскольку логика авторизации c будет (возможно, часто) изменяться в будущем, я хотел бы просто вызвать авторизацию для ресурса изнутри обработчик.

Наивно я просто попытался внедрить AuthorizationService в обработчик и получил исключение при запуске из-за циклической зависимости.

        public class AttachmentAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement, Attachment>
        {
            private readonly UserManager<User> _userManager;
            private readonly ApplicationDbContext _dbcontext;
            private readonly IAuthorizationService _authorizationService;

            public AttachmentAuthorizationHandler(ApplicationDbContext dbcontext,
                                                  UserManager<User> userManager,
                                                  IAuthorizationService authorizationService)
            {
                _dbcontext = dbcontext;
                _userManager = userManager;
                _authorizationService = authorizationService;
            }

            ...    
            other authorization logic
            ...

            if(_authorizationService.AuthorizeAsync(context.User, ticket, TicketOperations.Read).Result.Succeeded) 
            { 
                context.Succeed(req);
                return Task.CompletedTask;
            }
    A circular dependency was detected for the service of type 'Microsoft.AspNetCore.Authorization.IAuthorizationService'.
    Microsoft.AspNetCore.Authorization.IAuthorizationService(Microsoft.AspNetCore.Authorization.DefaultAuthorizationService) ->
Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider(Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerProvider) ->
System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationHandler> ->
Microsoft.AspNetCore.Authorization.IAuthorizationHandler(Ticketsystem.Authorization.Attachments.AttachmentAuthorizationHandler) ->
Microsoft.AspNetCore.Authorization.IAuthorizationService

Предложения о том, как я могу обойти это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...