将Windows凭据发送到websocket(WebSockets4Net)

时间:2017-01-12 16:50:01

标签: wpf wcf iis websocket windows-authentication

更新

我们正在使用WebSockets4Net,它也不适用于Windows身份验证。从我们的调查中获得Windows身份验证以使用WebSockets4Net的唯一方法是重写握手,这是过度的。

为解决此问题,我们创建了一个单独的Web套接字实现。 Windows 8及更高版本我们使用默认的MS WebSocket客户端,只需设置SendDefaultCredentials = true。在较旧的客户端上,我们在应用程序中放弃了对Windows身份验证的支持。

结束更新

我们有一个客户端要求为所有IIS服务器启用Windows身份验证并关闭匿名访问。

当启用Windows身份验证并关闭匿名访问时,我们的WCF REST端点就可以正常连接。

WebSocket连接尝试始终返回未授权的401。在握手期间,它不会通过任何Windows凭证发送。

客户端是使用WebSockets4Net的WPF应用程序。我在他们的项目页面上发了一个问题,问了同样的问题。

我可以在客户端请求中添加我可能需要的任何标头,我只是不知道我应该发送什么。我假设类似于:

Authorization: Negotiate Base64CredentialsGoHere

但是我的尝试失败了。

这是请求标题(来自fiddler):

GET /patchis/DispatchSystem.svc/DispatchWebSocket HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: NzkwMTk3ZDctNzYzNy00NQ==
Host: server.company.com
Origin: ws://server.company.com

以下是响应标题:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Thu, 12 Jan 2017 15:51:23 GMT
Content-Length: 6069
Proxy-Support: Session-Based-Authentication

我已经更改了以下绑定并验证它适用于MS Websockets实现。我们必须支持Windows 7,因此我们无法使用.Net代码。:

<customBinding>
    <binding name="customWebSocket">
      <byteStreamMessageEncoding />
      <httpsTransport maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600" maxBufferSize="6553600" authenticationScheme="Negotiate">
        <webSocketSettings transportUsage="Always" createNotificationOnConnection="true" keepAliveInterval="00:00:30"  />
      </httpsTransport>          
    </binding>
  </customBinding>

0 个答案:

没有答案