Как защитить конечные точки gRPC с приоритетом кода с помощью проверки подлинности Azure?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как защитить конечные точки gRPC с приоритетом кода с помощью проверки подлинности Azure?

Сообщение Anonymous »

Я создаю микросервис. У меня есть несколько рабочих конечных точек REST, защищенных JWT, созданных Microsoft Azure. Вот как проверяется токен:

Код: Выделить всё

builder.Services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
builder.Configuration.Bind("Authorization:AzureAd", options);
options.UseSecurityTokenValidators = true;
},
options =>
{
builder.Configuration.Bind("Authorization:AzureAd", options);
});
builder.Services.AddAuthorization();
Я получаю JWT от Postman, используя свою учетную запись Azure. Например, когда я использую свой токен в Swagger, он работает (200), в противном случае, без действующего токена, я получаю 401, как и ожидалось.
Теперь я пытаюсь интегрировать конечные точки gRPC с та же самая безопасность.
Идея состоит в том, чтобы использовать protobuf-net.Grpc для разработки конечных точек с использованием подхода «сначала код» и предоставляет файлы .proto. моим клиентам, которые должны работать с использованием обычного подхода «сначала контракт» с библиотекой Grpc.AspNetCore.
Во-первых, вот интерфейс:

Код: Выделить всё

[ServiceContract]
public interface IGreeterServiceContract
{
[OperationContract]
Task SayHelloAsync(GreeterRequest request, CallContext context = default);
}
Затем реализация с атрибутом [Authorize]:

Код: Выделить всё

public class ServerGreeterService(IGreeterService _greeterService) : IGreeterServiceContract
{
[Authorize]
public Task SayHelloAsync(GreeterRequest request, CallContext context = default)
{
string result = _greeterService.SayHello(request.Name);
GreeterResponse response = new GreeterResponse { Message = result };
return Task.FromResult(response);
}
}
Обратите внимание, что эта конечная точка вызывается правильно. Если я удалю атрибут [Authorize], он будет работать как положено (но, очевидно, без какой-либо проверки безопасности).
Используя ProtoBuf.Grpc.Reflection, я сгенерируйте следующие файлы .proto:

Код: Выделить всё

syntax = "proto3";
package TestGrpc.Services.Abstractions;

message GreeterRequest {
string Name = 1;
}
message GreeterResponse {
string Message = 1;
}
service GreeterServiceContract {
rpc SayHello (GreeterRequest) returns (GreeterResponse);
}
Затем я создаю новое клиентское решение и генерирую клиентскую службу из предыдущего файла .proto. Вот как я регистрирую клиента в DI:

Код: Выделить всё

builder.Services.AddGrpc();
builder.Services.AddScoped();

builder.Services.AddGrpcClient(o =>
{
o.Address = new Uri("http://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
})
.ConfigureChannel(o =>
{
o.Credentials = Grpc.Core.ChannelCredentials.Insecure;
o.UnsafeUseInsecureChannelCallCredentials = true; // REMOVE FROM PRODUCTION
})
.AddCallCredentials((context, metadata, serviceProvider) =>
{
var httpContext = serviceProvider.GetRequiredService().HttpContext;
if (httpContext != null && httpContext.Request.Headers.TryGetValue("Authorization", out var authHeader))
{
var token = authHeader.ToString().Split(" ").Last();
if (!string.IsNullOrEmpty(token))
{
metadata.Add("Authorization", $"Bearer {token}");
}
}
return Task.CompletedTask;
});
Этот код кажется работоспособным. Я создаю конечную точку REST, защищенную атрибутом [Authorize], и эта конечная точка вызывает другой микросервис с помощью gRPC, чтобы получить результат GreeterService. Metadata.Add() вызывается всякий раз, когда клиент внедряется, и токен корректно извлекается (и должен быть передан клиенту gRPC).
Но сервер возвращает результат 401 (без аутентификации).
На этом этапе я не могу проверить метаданные, отправленные от клиента или полученные сервером. Возможно, метаданные даже не передаются на сервер или не принимаются.
Читая документацию protobuf-net, я не могу найти пример использования Azure JWT проверка. Но я думаю, что механизм очень похож.
Чего мне здесь не хватает? Как я могу защитить свои конечные точки с приоритетом кода с помощью проверки подлинности Azure?

Подробнее здесь: https://stackoverflow.com/questions/786 ... entication
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»