C# 使用gRPC自定义基于通道的身份验证

C# 使用gRPC自定义基于通道的身份验证,c#,authentication,.net-core,basic-authentication,grpc,C#,Authentication,.net Core,Basic Authentication,Grpc,如何在dotnet中使用gRPC进行简单通道身份验证 我希望在通道连接期间只传递客户机名称和客户机服务名称,然后能够在服务器中获取这些名称一次,作为识别请求来自何处的一种方法 我不想在每次调用中都将它们作为元数据传递,也不想为此实现额外的方法。我一直在查看文档,并尝试实现一些抽象类,如ServerCredentials,但我不知道如何实现,即使由于某些内部类的原因,也不知道如何实现 当然,我不想为此使用SSL证书,也不想使用OAuth2。Auth元数据中的数据 在元数据中传递它们是一个很好的解决

如何在dotnet中使用gRPC进行简单通道身份验证

我希望在通道连接期间只传递客户机名称和客户机服务名称,然后能够在服务器中获取这些名称一次,作为识别请求来自何处的一种方法

我不想在每次调用中都将它们作为元数据传递,也不想为此实现额外的方法。我一直在查看文档,并尝试实现一些抽象类,如
ServerCredentials
,但我不知道如何实现,即使由于某些内部类的原因,也不知道如何实现

当然,我不想为此使用SSL证书,也不想使用OAuth2。

Auth元数据中的数据 在元数据中传递它们是一个很好的解决方案。看一看。您的头将被压缩,只需要几个字节

您不能将身份验证数据绑定到该通道,因为在HTTP/2中不能保证相同的TCP通道将用于后续调用

尽管如此,我仍在等待GRPCJava团队提供一个关于基于元数据的自定义身份验证的适当示例

基于流的身份验证 如果要在同一API的后续调用之间保存身份验证数据,也可以选择基于流的身份验证。在我的解释中,这意味着您必须仅在流的开头传递身份验证数据。然后,您的StreamObserver可以保存身份验证数据,并在后续的
onNext()
调用中重用它。我使用这种方法,效果非常好

范例

service MyService {
  rpc myFunction(stream MyMessage) returns (stream MyResponse)
}
message MyMessage {
  string user = 1;
  string password = 2;

  int32 myMessageVariable = 3;
}
只能在
requestObserever
上的第一次
onNext(myMessage)
调用中设置用户/密码。
这也是非常有效的,因为在网络上,流由单个字节的StreamId表示(取决于您同时打开的流的数量)。

身份验证通常意味着具有某种验证给定身份的机制;听起来你只是想在客户端为你的频道添加一个名称/标签,让服务器自动“信任”这个信息。如果这确实是您想要的,那么元数据或附加到请求消息的字段是合适的解决方案。您能否提供一个将C#stream observer与GRPC结合使用的示例?我正在努力寻找一个如何做到这一点的例子,我对C#还是相当陌生的。很抱歉,在过去的十年中,我没有使用C#:)从这个例子中,我发现实现与Java并不十分相似。不过,gitter上的开发人员反应非常积极。我想试试-