Аналог фильтра ASP.NET Core MVC для службы gRPC - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть существующий REST API, работающий на ASP.NET Core 3.0.Он использует MVC-фильтр для выполнения проверки авторизации на основе значения заголовка и возвращает ошибку в случае неудачной авторизации, поэтому запрос не передается на контроллер.

Теперь я экспериментирую с gRPC и пытаюсь портироватьэто API для службы gRPC.Однако я не вижу никаких очевидных решений, которые могли бы действовать как замена фильтра MVC.

Есть ли какой-нибудь способ добиться аналогичной функциональности проверки авторизации, возможно, используя метаданные ?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Для MVC и gRpc они разные.ActionFilter не существует в gRpc.

Если вы хотите применить проверку заголовка запроса для всех действий, вы можете попробовать реализовать свое промежуточное ПО до app.UseEndpoints и проверить заголовок запроса.

Для другогоКстати, вы можете попробовать Policy, как показано ниже:

  1. GrpcRequireemnt и GrpcHandler

    public class GrpcRequireemnt : IAuthorizationRequirement
    { 
    
    }
    public class GrpcHandler : AuthorizationHandler<GrpcRequireemnt>
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
    
        public GrpcHandler(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, GrpcRequireemnt requirement)
        {
    
            var headers = _httpContextAccessor.HttpContext.Request.Headers;
            StringValues token;
            if (!headers.TryGetValue("token", out token))
            {
                context.Fail();
                return Task.CompletedTask;
            }
            context.Succeed(requirement);
            return Task.CompletedTask;
    
        }
    }
    
  2. Регистрация необходимых услуг

    services.AddAuthorization(options =>
    {
        options.AddPolicy("TokenAuthorize", policy =>
        {                   
            policy.AddRequirements(new GrpcRequireemnt());
        });
    });
    services.AddHttpContextAccessor();
    services.AddSingleton<IAuthorizationHandler, GrpcHandler>();
    
  3. UseCase

    [Authorize("TokenAuthorize")]
    public override Task<BuyTicketsResponse> BuyTickets(BuyTicketsRequest request, ServerCallContext context)
    {
        var user = context.GetHttpContext().User;
    
        return Task.FromResult(new BuyTicketsResponse
        {
            Success = _ticketRepository.BuyTickets(user.Identity.Name!, request.Count)
        });
    }
    
2 голосов
/ 26 сентября 2019

Ответы будут немного отличаться в зависимости от того, используете ли вы Grpc.Core , который является оболочкой для библиотеки C GRPC, первоначально разработанной в Google, которая была доступна некоторое время и поддерживаетразнообразные цели .Net (включая Framework), или если вы используете новый Grpc.AspNetCore , который запущен с .Net Core 3.0 и построен на внутреннем оборудовании Kestrel и ASP.NET Core.

Grpc.Core

Для Grpc.Core вы хотите передать значение заголовка в качестве метаданных, а затем создать Перехватчик на стороне сервера для обработки метаданных и запроса.Можно также рассмотреть возможность использования AsyncAuthInterceptor , однако базовая реализация Grpc на стороне клиента не будет отправлять учетные данные через небезопасные (не TLS) соединения.

Grpc.AspNetCore

Grpc.AspNetCore построен на ASP.NET, и может использовать промежуточное программное обеспечение ASP.NET , включая аутентификацию ASP.NET по умолчанию.Если вы сможете преобразовать свой фильтр в промежуточное ПО, вы сможете разделить аутентификацию между двумя реализациями.

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