来自服务器的间歇性“401:未授权”例外

时间:2011-09-13 14:57:26

标签: .net wcf iis-6 wcf-security windows-authentication

我有一个托管在集群环境中的Web服务。调用此服务的Web应用程序也托管在群集环境中,但位于另一组IIS6服务器上。因此,应用程序服务器是appserv1和appserv2,服务服务器是svcserv1和svcserv2。我们不控制访问哪些服务器,因为我们通常只将它们称为appserv或svcserv 该服务是WCF服务,但已创建为与.Net 2.0 Web服务框架兼容。应用程序在运行时运行良好,但可能> 35%的时间服务以异常响应:请求失败,HTTP状态为401:未授权。错误。

我见过其他人建议直接设置凭证,我的应用程序正在执行以下操作。

Dim cc As New CredentialCache()
Dim service As WCFServiceRef.Reports

service = New WCFServiceRef.Reports

service.Url = serviceURL
cc.Add(New Uri(service.Url), "Negotiate", New NetworkCredential("username", "password"))
service.Credentials = cc

reportData = service.GenerateReport(reportid, True, parameters, "PDF", Environment)

我还尝试通过更改引用URL来绕过加载管理器直接访问各个服务器,然后直接转到服务器的域名,但这没有任何区别。

我也看过this MSDN知识库文章,但由于我没有直接访问服务器配置(并且很难改变任何内容),我想确保没有我可以做的事情从申请方面来看。请注意,服务器已配置为Windows身份验证,不允许匿名访问。

谢谢!

3 个答案:

答案 0 :(得分:2)

这很大程度上取决于您的身份验证尝试是使用Kerberos还是回退到NTLM。我建议使用像Fiddler这样的工具来捕获从应用服务器发送的数据包,以验证正在使用的身份验证协议。

如果您发现自己正在使用Kerberos,请尝试以下几点:

  1. 让您的管理员在两台服务器上启用Kerberos错误日志记录,然后重新尝试身份验证并检查事件日志中的任何Kerberos错误。见http://support.microsoft.com/kb/262177
  2. 检查为您的服务注册的SPN - 假设您的服务的FQDN是myservice.prd.ad,您需要两个SPN - 如果您的IIS6应用程序池未作为服务运行,它们应该注册到托管您服务的服务器帐户,应该注册到服务帐户:
    • HTTP / MYSERVICE.PRD.AD
    • HTTP / MYSERVICE
  3. 还要确保为您的服务注册的任何DNS条目都是A(主机名)记录而不是CNAME(别名)记录。我在使用过的环境中遇到了一些问题,当CNAME记录用于DNS时,XP / 2003计算机试图为错误的SPN获取Kerberos票证(而Windows 7/2008计算机没有)。
  4. 您还可以尝试在服务服务器上安装DelegConfig,它非常擅长整理人们使用Kerberos身份验证时遇到的最常见问题。请参阅http://www.iis.net/community/default.aspx?tabid=34&g=6&i=1887
  5. 希望这有点帮助。如果你正在使用NTLM,那么我很遗憾没有很多想法,因为我习惯于在仅限Kerberos的环境中工作。

答案 1 :(得分:1)

首先检查每台计算机上的IIS日志,看看401错误是否来自一台计算机。

接下来要检查的是401是否与特定网址相关。

答案 2 :(得分:0)

要考虑的另一件事:

你需要粘性会话吗? 是否存在经常回收的服务器?

有很多理由说明为什么你可能会得到401s,所以你只需要挖掘并找出发生了什么。