如何在dotnet中使用gRPC进行简单的通道身份验证?
我希望在通道连接期间只传递客户端机器名称和客户端服务名称,然后能够在服务器中获得它们一次,以此作为识别请求来自何处的一种方式。
我不想在每次调用中都将它们作为元数据传递,我也不想为此实现一个额外的方法。我一直在看文档,并试图实现一些抽象类,如ServerCredentials
,但我不知道如何实现,即使是由于一些内部类也是可能的。
当然,我不想为此使用SSL证书,也不想使用OAuth2。
发布于 2018-06-07 05:59:37
对元数据中的数据进行验证
在元数据中传递它们是一个很好的解决方案。看看hpack吧。你的头将被压缩,只需要几个字节。
您不能将身份验证数据绑定到通道,因为在HTTP/2中不能保证后续调用将使用相同的TCP通道。
也就是说,我仍然在等待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表示的,它是一个字节(取决于您同时打开的流的数量)。
https://stackoverflow.com/questions/50725167
复制相似问题