【发布时间】:2018-01-24 01:07:15
【问题描述】:
我有一个充当 api 网关的无状态服务以及一个部署到 Azure 上的安全服务结构集群(使用 Azure AD)的有状态服务。我公开了一个 websocket 端点(wss)。从我的客户端应用程序(使用 ClientWebSocket 实例的控制台应用程序)连接时,我收到“无法连接到远程服务器”并出现内部异常,说明:“身份验证失败,因为远程方已关闭传输流。”如果我附加了集群保护的 SSL 证书(来自我的本地计算机),或者如果我在创建时将我的 NetworkCredentials 与 ClientWebsocket 对象一起传递,则会发生这种情况。我要访问的端点如下所示:wss://blahblahblah.cloudapp.azure.com:19000/mygateway/data。当我在保护它之前在本地测试此代码时,我能够连接。一旦我将它成功部署到安全集群,我的客户端应用程序将无法连接。我还需要从客户端提供什么东西才能通过安全检查吗?
public async Task<bool> ConnectAsync(Uri serviceAddress)
{
this._clientWebSocket = new ClientWebSocket();
using (CancellationTokenSource tcs = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
try
{
_clientWebSocket.Options.ClientCertificates = GetCertForRemoteAuthentication();
_clientWebSocket.Options.Credentials = new NetworkCredential{Domain = "mydomain", Password = "somepassword", UserName = "username"};
await this._clientWebSocket.ConnectAsync(serviceAddress, tcs.Token);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
return true;
}
【问题讨论】:
-
我怀疑一旦你连接了一个 cookie 就已经建立了。我会尝试从 IE 历史记录中删除 cookie,然后再试一次。我还会使用像wireshark或fiddler这样的嗅探器来捕获结果,这样你就可以让你的代码在使用和不使用cookie的情况下都一样。您使用的凭据是否与建立初始连接时使用的凭据相同。 cookie 和特定用户之间可能存在关联。
-
在它被保护之前,我没有专门传递任何凭据。我会看看 Fiddler,看看它向我展示了什么。
-
将我的客户端证书指纹添加到我的 SF 集群中,认为这是问题所在,但并没有解决问题。 Fiddler 目前并没有告诉我太多信息 - 我看不到在 fiddler 中尝试连接的位置,但我可能没有在那里设置任何东西。
-
我确实在提琴手中看到我的服务结构应用程序有一条隧道,但由于某种原因它使用 http - 而不是 https 或 wss。不知道为什么我会在提琴手中看到它。
-
找到了Fiddler的日志。与 blahblahblah.cloudapp.azure.com(对于 #33)的 HTTPS 握手失败。 System.IO.IOException 身份验证失败,因为远程方已关闭传输流。
标签: c# websocket azure-service-fabric