我在使用 IIS 5.1 的 Win XP 上运行的 ASMX Web 服务存在一些问题。IIS 设置有集成 Windows 身份验证并禁用匿名访问。(当我启用匿名访问时,一切都像魅力一样。)
但是,当我关闭匿名访问并在 IIS 上仅使用集成 Windows 身份验证运行时,我收到以下异常:
HTTP 请求未经客户端身份验证方案“协商”的授权。从服务器收到的身份验证标头是“协商,NTLM”。
这个异常是由我用来测试概念的非常简单的控制台应用程序生成的:
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; // .None;
binding.UseDefaultWebProxy = false;
EndpointIdentity spn = EndpointIdentity.CreateSpnIdentity("WORKGROUP/VirtualXP-91051");
Uri uri = new Uri("http://169.254.91.91/MyWebSite/MyService.asmx");
EndpointAddress address = new EndpointAddress(uri, spn);
MyServiceSoapClient client = new MyServiceSoapClient(binding, address);
client.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
String req = "( the request string is blanked out.. ;) )";
string resp = client.ReqAddressData(req);
Console.WriteLine(resp);
Console.ReadLine();
App.config 中有趣的部分:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
这不是火箭科学,所以我一定遗漏了一些明显的东西。我已经在 SO 上进行了一些搜索,尽管我可以找到许多类似的问题,但我没有发现任何可以解决我的问题的问题。