c# - 使用 gRPC 进行基于自定义 channel 的身份验证

标签 c# authentication .net-core basic-authentication grpc

如何在 dotnet 中使用 gRPC 进行简单的 channel 身份验证?

我只想在 channel 连接期间传递客户端机器名称和客户端服务名称,然后能够在服务器中获取一次,作为识别请求来自何处的一种方式。

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

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

最佳答案

元数据中的授权数据

将它们传递到元数据中是一种很好的解决方案。看看hpack .您的标题将被压缩,只需要几个字节。

您不能将您的身份验证数据绑定(bind)到 channel ,因为在 HTTP/2 中不能保证相同的 TCP channel 将用于后续调用。

也就是说,我仍在等待 GRPC java 团队提供基于元数据的自定义身份验证的适当示例。

基于流的身份验证

如果您想在同一 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# - 使用 gRPC 进行基于自定义 channel 的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50725167/

相关文章:

c# - 将多个枚举合并到主枚举列表中

authentication - 如何从另一个keycloak实例B检查验证keycloak实例A用户?

python - 使用python登录谷歌?

c# - .net 核心 2.x 的用户界面

c# - WCF:单个方法或接受 xml 的通用 ProcessMessage 方法

C# 非邪恶的快速数组查找?

c# - AspNetCore默认授权用户未经过身份验证

c# - 如何在 .net 核心中使用 Swagger Codegen

c# - count++和++count,什么时候用哪个?

c# - soapheader认证