更新
我们正在使用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>