代码之家  ›  专栏  ›  技术社区  ›  paburgos

尝试使用protobuf-net通过gRPC Web进行Azure AD身份验证

  •  0
  • paburgos  · 技术社区  · 5 年前

    我正在尝试在blazor webassembly应用程序中使用gRPC Web进行Azure AD身份验证。我正在使用protobuf网络来帮助我进行序列化。我不确定如何传递令牌以使服务器端识别它。这是我所拥有的:

    var headers = new Metadata
                   {
                     { "Authorization", $"Bearer {Token}" }
                   };
    

    并且,我将其作为我要使用的方法中的参数发送

    var result = await Client.CreateCustomer(this.customer, headers);
    

    服务注入方式如下:

    builder.Services.AddTransient(services =>
            {
                var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
                var channel = Grpc.Net.Client.GrpcChannel.ForAddress("****", new GrpcChannelOptions { HttpClient = httpClient });
                return channel.CreateGrpcService<Application.Services.ICustomerService<ServerCallContext>>();
            });
    

    服务发布方式如下:

    endpoints.MapGrpcService<CustomerService>().RequireAuthorization().EnableGrpcWeb()
    

    这是实现:

    public class CustomerService : ICustomerService<ServerCallContext>
    {
        [Authorize]
        public async ValueTask<Customer> CreateCustomer(Customer customerDTO, ServerCallContext context) 
        {****}
    }
    

    我收到的错误是无法从'Grpc转换。核心。元数据“到”Grpc。核心。ServerCallContext”,这有点明显。

    我找到的引用使用了元数据,但我应该使用ServerCallContext吗 https://learn.microsoft.com/en-us/dotnet/architecture/grpc-for-wcf-developers/metadata 那么我错过了什么,我做错了什么,如何使用protobuf-net正确使用这两者?

    0 回复  |  直到 5 年前
        1
  •  3
  •   Marc Gravell    5 年前

    看起来这里的问题是你正在使用 ServerCallContext 在方法签名中;底层gRPC核心具有单独的客户端/服务器上下文API,但这不适合在不可知接口上使用,因此也不适合在protobuf-net上使用。Grpc 统一 这两个API,通过 CallContext 因此:而不是:

    async ValueTask<Customer> CreateCustomer(Customer customerDTO, ServerCallContext context)
    

    对于签名,请考虑:

    async ValueTask<Customer> CreateCustomer(Customer customerDTO, CallContext context)
    

    async ValueTask<Customer> CreateCustomer(Customer customerDTO, CallContext context = default)
    

    这个 CallContext API以单一方式公开常见的服务器端和客户端API(头、取消等),或者您可以使用(例如) context.ServerCallContext 以在需要时获取特定于服务器的API(如果在客户端-文本上使用,则会引发异常)。对于客户端使用,a CallContext 可以由一个 CallOptions ,是核心gRPC客户端API,例如:

    var result = await service.CreateCustomer(customer, new CallOptions(headers));
    

    我是 打开 允许的想法 CallContext 直接创建自 Metadata / CancellationToken 等(允许 var result = await service.CreateCustomer(customer, headers); )-但似乎不是 本质的 .