当前位置: 首页 > 知识库问答 >
问题:

ASP。NET核心grpc客户端:配置HTTP授权

戚建白
2023-03-14

遵循以下文档:https://docs.microsoft.com/fr-fr/aspnet/core/grpc/authn-and-authz?view=aspnetcore-3.0#承载令牌身份验证,我尝试配置我的GRPC客户端以自动注入JWT令牌。

    private static GrpcChannel CreateAuthenticatedChannel(string address)
    {
        var _token = "xxx"; //using some hardcoded JWT token for testing
        var credentials = CallCredentials.FromInterceptor((context, metadata) =>
        {
            if (!string.IsNullOrEmpty(_token))
            {
                metadata.Add("Authorization", $"Bearer {_token}");
            }
            return Task.CompletedTask;
        });

        var channel = GrpcChannel.ForAddress(address, new GrpcChannelOptions
        {
            Credentials = ChannelCredentials.Create(ChannelCredentials.Insecure, credentials)
        });
        return channel;
    }

但它被Grpc.Core中的一个例外“提供的通道凭据不允许组合”窒息

System.ArgumentException
  HResult=0x80070057
  Message=Supplied channel credentials do not allow composition.
  Source=Grpc.Core.Api
  StackTrace:
   at Grpc.Core.Utils.GrpcPreconditions.CheckArgument(Boolean condition, String errorMessage)
   at Grpc.Core.ChannelCredentials.CompositeChannelCredentials..ctor(ChannelCredentials channelCredentials, CallCredentials callCredentials)
   at Grpc.Core.ChannelCredentials.Create(ChannelCredentials channelCredentials, CallCredentials callCredentials)
   at Service2.StartupCommon.CreateAuthenticatedChannel(String address) in xxx\Service2\StartupCommon.cs:line 32

这是什么意思?我应该如何提供HTTP授权标头?

共有1个答案

施弘壮
2023-03-14

在对c#的Grpc源代码进行一些挖掘之后,特别是在 https://github.com/grpc/grpc/blob/master/src/csharp/Grpc.Core.Api/ChannelCredentials.cs,我们可以看到ChannelCredentials.Insecure不会覆盖IsComposable(而Grpc.Core.Api/SslCredentials上提供的SslCredentials.cs确实覆盖了该设置)

因此,我认为作者的目的是防止在不安全的通道上使用凭据,您必须使用< code>new SslCredentials()。

因此,我尝试在本地计算机上设置HTTPS,在出现一些问题后(即,我必须创建一个ASP.NET web api项目并启动它,因此它建议创建一个HTTPS证书,并将其添加到Windows可信机构中,或多或少基于Visual Studio中的启用SSL),一切都正常工作

因此,如果有来自微软的一些人 ASP.NET 核心文档,请修改您的文档:

// SslCredentials is used here because this channel is using TLS.
// Channels that aren't using TLS should use ChannelCredentials.Insecure instead.
var channel = GrpcChannel.ForAddress(address, new GrpcChannelOptions
{
    Credentials = ChannelCredentials.Create(new SslCredentials(), credentials)
});

这不是真的:您必须使用安全通道才能更改凭据

 类似资料:
  • . NET Core gRPC-Web客户端调用ASP.NETCore gRPC-Web服务器http://localhost:5000正常工作。 与部署到具有虚拟应用程序的IIS服务器的客户端代码调用服务器相同(例如http://build.mycompany.ca/myapp)的结果 状态(StatusCode="未实现",Detail="错误的gRPC响应。HTTP状态代码:404") 我的

  • 今天遇到一些问题,我需要知道它们之间的具体区别 < code >编译“com . firebase:firebase-client-Android:2 . 4 . 0” 和 不要注意版本 所以请分享你的知识。

  • 我用的是protobuf-net。Grpc并试图从. NET Framework (4.7.2)进行调用。)gRPC客户端。完整的例子在这里:https://github.com/angelagyang/GRPCProtobufExample 下面是我的客户的一个片段: 使用此配置,我在调用服务器时得到错误。如果我在服务器上设置,我就能够连接到服务器。但是,我希望服务器需要客户端证书并通过指纹验证

  • 我正在尝试运行我的asp。net核心wep应用程序在docker容器中使用官方的Microsoft asp。net核心2.1映像。我的应用程序使用端口5000公开api。此端口在appSettings.json的自定义部分中配置 这是我使用的泊坞站命令 在索引容器日志中,我得到了以下信息: 当我试图去 http://localhost:5000 时,我会ERR_EMPTY_RESPONSE。似乎容

  • 我有两台服务器使用相同的ASP。NET核心标识后端。我使用以下命令生成密码重置令牌: 我通过电子邮件链接发送此令牌。当用户单击链接时,他们会被带到一个单独的站点,该站点应提供一个用户界面来更改密码。以下代码处理用户提交令牌及其新密码的密码: 在第二台服务器上,标识结果总是返回false,因为“无效令牌”。 通过查看源代码,我看到令牌是使用IP地址生成的(因此我理解令牌验证失败的原因)。 我的问题是

  • 回到RC1,我会这样做: 在RC2中,不再有,并且没有任何东西可以让我返回500类型的IActionResult。 我现在问的方法完全不同了吗?我们是否不再尝试捕获代码?我们是否只是让框架将一个泛型500异常抛回API调用者?对于开发,如何查看确切的异常堆栈?