如何在 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/