Web 服务 HTTP 请求未经授权,带有方案摘要

Posted

技术标签:

【中文标题】Web 服务 HTTP 请求未经授权,带有方案摘要【英文标题】:Web service HTTP request is unauthorized with scheme digest 【发布时间】:2013-08-14 15:28:48 【问题描述】:

我在从 C# 客户端调用 Web 服务时遇到了一些问题。偶尔会返回如下错误:

WWW-Authenticate: Basic realm="[SomeRealm]"'. --->
System.ServiceModel.Security.MessageSecurityException: 
The HTTP request is unauthorized with client authentication scheme 'Digest'. 
The authentication header received from the server was 'Digest realm="[SomeRealm]",
nonce="00000717Y382188758809db0bcc622bdf37def3deabb93", stale=FALSE, qop="auth"
WWW-Authenticate: Basic realm="[SomeRealm]"'. ---> 
System.Net.WebException: The remote server returned an error: (401) Unauthorized.

但我不知道为什么,而且它真的很难重现,因此调试起来非常棘手。大多数时候,对 Web 服务的调用工作得很好。有人知道为什么会这样吗?或者有关如何调试和获取有关该问题的更多信息的任何提示?

更新:

好的,所以我尝试查看使用 fiddler 进行的通信,但这并没有让我变得更聪明。

这是一个有效的请求/挑战/请求/响应

请求

POST http://192.168.1.3/api/services HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8;
action="http://www.domain.com/api/ws/event1/GetScheduledEvents"
Host: 192.168.1.3
Content-Length: 482
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

挑战

HTTP/1.1 401 Unauthorized
Date: Wed, 14 Aug 2013 07:45:49 GMT
Accept-Ranges: bytes
Connection: close
WWW-Authenticate: Digest realm="[SomeRealm]",
once="00025a89Y1892894c7fb9fe5f9de425b40c72d72de3227", stale=FALSE, qop="auth"
WWW-Authenticate: Basic realm="[SomeRealm]"
Content-Length: 180
Content-Type: text/html; charset=ISO-8859-1

<HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD>
<BODY><H1>401 Unauthorized</H1>
Your client does not have permission to get URL /api/services from this server.
</BODY></HTML>

请求

POST http://192.168.1.3/api/services HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.domain.com/api/ws/event1/GetScheduledEvents"
Accept-Encoding: gzip, deflate
Authorization: Digest username="UserName",realm="[SomeRealm]",nonce="00025a89Y1892894c7fb9fe5f9de425b40c72d72de3227",uri="/api/services",cnonce="abff70e14c8f89b09abac9eaaa9de8ce",nc=00000001,qop="auth",response="df71769f9fb2bb5e1396546b7422d5fd"
Host: 192.168.1.3
Content-Length: 482
Connection: Keep-Alive

回应

HTTP/1.1 200 OK
Authentication-Info: qop=auth, rspauth="51832dfe63819c551bf666409f58b08c", cnonce="abff70e14c8f89b09abac9eaaa9de8ce", nc=00000001
Server: gSOAP/2.7
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 3752
Connection: close

这是失败的请求/挑战/请求/响应之一

请求

POST http://192.168.1.3/api/services HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.domain.com/api/ws/event1/GetScheduledEvents"
Host: 192.168.1.3
Content-Length: 482
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

挑战

HTTP/1.1 401 Unauthorized
Date: Wed, 14 Aug 2013 07:45:49 GMT
Accept-Ranges: bytes
Connection: close
WWW-Authenticate: Digest realm="[SomeRealm]", nonce="00025a89Y3757607d2e481c5c24cb20f1a46b129a37218", stale=FALSE, qop="auth"
WWW-Authenticate: Basic realm="[SomeRealm]"
Content-Length: 180
Content-Type: text/html; charset=ISO-8859-1

<HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD>
<BODY><H1>401 Unauthorized</H1>
Your client does not have permission to get URL /api/services from this server.
</BODY></HTML>

请求

POST http://192.168.1.3/api/services HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.domain.com/api/ws/event1/GetScheduledEvents"
Accept-Encoding: gzip, deflate
Authorization: Digest username="UserName",realm="[SomeRealm]",nonce="00025a89Y3757607d2e481c5c24cb20f1a46b129a37218",uri="/api/services",cnonce="9daae13f56820d9edf12cbf7e41f894b",nc=00000001,qop="auth",response="18d885af71eb74d1476da0f3668bf00e"
Host: 192.168.1.3
Content-Length: 482
Connection: Keep-Alive

回应

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="[SomeRealm]", nonce="00025a89Y412766b2f55e4fc54dbd441b95cc713e08ccb", stale=FALSE, qop="auth"
WWW-Authenticate: Basic realm="[SomeRealm]"
Server: gSOAP/2.7
Content-Type: text/xml; charset=utf-8
Content-Length: 0
Connection: close

【问题讨论】:

【参考方案1】:

在我的 WCF 端点上设置安全性时,我遇到了很多问题,找到模糊错误原因的最简单方法(我有很多)是在主机上打开 Web 服务的日志跟踪和客户端。我还发现使用 Fiddler 作为消息拦截器/代理效果很好。使用这些工具,您将获得有关 Web 服务中正在发生的事情的更多信息。

以下是打开跟踪的链接: How to turn on WCF tracing?

这是使用 fiddler 找出问题的链接:How to use Fiddler to monitor WCF service

祝你好运。

【讨论】:

谢谢,很多解决方案似乎都是为了在服务器上启用跟踪。服务器不托管 WCF 服务,我无权访问它,是否也可以在客户端上启用 WCF 跟踪? 找到了。这成功了:msdn.microsoft.com/en-us/library/ms730064.aspx 在此过程中也可以使用 Fiddler,因为 Fiddler 可以捕获进出服务的所有消息,允许您比较有效的消息和失败的消息。您已设置 Fiddler 以在 Web 服务正在侦听 8000 时侦听端口(例如)8888。请求将发送到 8888,然后 Fiddler 将消息重新发送到正确的主机端口,保存请求/及时响应。【参考方案2】:

您对 Web 服务 Basic 或 Digest 使用什么类型的身份验证。因为并非所有浏览器都支持摘要

【讨论】:

我使用的身份验证是 Digest。我不使用网络浏览器来使用服务,它是一个 WCF 客户端。【参考方案3】:

所以看起来错误实际上是在服务器端。据我所知,这是一些线程问题,这似乎是合理的,因为我向服务器发送了很多请求。

【讨论】:

以上是关于Web 服务 HTTP 请求未经授权,带有方案摘要的主要内容,如果未能解决你的问题,请参考以下文章

客户端身份验证方案“匿名”的 HTTP 请求未经授权?

HTTP 请求未经客户端身份验证方案“Ntlm”授权

HTTP 请求未经客户端身份验证方案“基本”授权。从服务器收到的身份验证标头为“基本领域 =”

HTTP 请求未经客户端身份验证方案“匿名”授权。从服务器收到的身份验证标头是“默认”。

HTTP 请求未经客户端身份验证方案“匿名”授权。从服务器收到的身份验证标头是“基本领域”

HTTP 请求未经客户端身份验证方案“基本”授权。从服务器收到的身份验证标头是“协商,NTLM”