Код: Выделить всё
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();
Теперь я пытаюсь интегрировать конечные точки gRPC с та же самая безопасность.
Идея состоит в том, чтобы использовать protobuf-net.Grpc для разработки конечных точек с использованием подхода «сначала код» и предоставляет файлы .proto. моим клиентам, которые должны работать с использованием обычного подхода «сначала контракт» с библиотекой Grpc.AspNetCore.
Во-первых, вот интерфейс:
Код: Выделить всё
[ServiceContract]
public interface IGreeterServiceContract
{
[OperationContract]
Task SayHelloAsync(GreeterRequest request, CallContext context = default);
}
Код: Выделить всё
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);
}
}
Используя 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);
}
Код: Выделить всё
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;
});
Но сервер возвращает результат 401 (без аутентификации).
На этом этапе я не могу проверить метаданные, отправленные от клиента или полученные сервером. Возможно, метаданные даже не передаются на сервер или не принимаются.
Читая документацию protobuf-net, я не могу найти пример использования Azure JWT проверка. Но я думаю, что механизм очень похож.
Чего мне здесь не хватает? Как я могу защитить свои конечные точки с приоритетом кода с помощью проверки подлинности Azure?
Подробнее здесь: https://stackoverflow.com/questions/786 ... entication