能否为 Windows 身份验证和匿名配置 IIS 托管的 WCF 服务?
-
13-09-2019 - |
题
我有一个小型 WCF Web 服务,与内置 WCF 服务主机一起使用,并由 Visual Studio 2008 内置开发 Web 服务器托管。
在这些托管环境中,我依赖 WCF 测试客户端来调用服务方法。
现在我在下一阶段的测试中遇到了问题:
我将其托管在我的 WinXP 开发计算机上的 IIS 5.1 中,我认为问题可能是我无法再继续使用 WCF 测试客户端。这是发生的事情:
情况1:“匿名访问”已选中(已启用)
WCF 测试客户端 UI 正常显示,显示 WebMethods 和 INVOKE 按钮。然而,当我单击 INVOKE 时,它无法连接需要 Windows 身份验证的后端数据存储(第 3 方产品)。我可以发布从product.DLL 返回的错误,但我认为它不相关。
案例2:“匿名访问”未选中(禁用)
WCF 测试客户端 UI 甚至无法正确初始化。我对此的研究告诉我,MEX(WS-元数据交换)需要“匿名访问”并且(显然)WCF 测试客户端需要 MEX。以下是返回的错误的关键片段:
Error: Cannot obtain Metadata from http://localhost/wcfiishost
The remote server returned an error: (401) Unauthorized.HTTP GET Error
URI: http://localhost/wcfiishost
There was an error downloading 'http://localhost/wcfiishost'.
The request failed with the error message:
Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service
其中有很多关于绑定选项、消息安全性等的解释。和我真的不明白的东西。这是我对自己处境的看法,但我很想听听您的意见:
(a) 因为我知道我的 WCF Web 服务必须配置为使用 Windows 身份验证,所以我得出结论,在 IIS 中托管我的服务时,我无法继续使用 WCF 测试客户端。它对我来说实际上已经失去了用处。我只需要花时间编写一个 Web 客户端,因为如果没有 Anonymous,WCFTestClient 将无法工作。
(或者)
(b) 如果 WCF 测试客户端和托管服务配置正确,则可以使用它(我只是不知道有什么特殊的配置技术)。
哪个是对的?是时候停止使用 WCFTestClient 了,还是有办法同时使用 WCFTestClient?预先感谢您的建议。
编辑:2009 年 6 月 11 日
我还能提供什么帮助其他人帮助我解决这个问题吗?
解决方案 3
当我设置这个问题的标题/主题并在这里陷入死胡同时,我在MSDN论坛中打开了相同的问题,但标题的重点有所不同(问题的内容基本相同)。
对我来说,真正的问题是如何在未设置匿名身份验证的情况下在 IIS 中使用 WCFTestClient(因为我的服务仅需要集成 Windows 身份验证)。
Mex 显然需要 Anonymous,并且默认情况下 WCFTestClient 似乎需要 Mex。关键似乎是适应我仔细修改 web.config 文件。
无论如何,我让它与下面的 web.config 一起工作(MSDN 链接在这里:
<?xml version="1.0"?>
<configuration>
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="wsBindingConfig"
contract="sdkTrimFileServiceWCF.IFileService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="basic"
binding="basicHttpBinding"
bindingConfiguration="bindingConfig"
contract="sdkTrimFileServiceWCF.IFileService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="bindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</basicHttpBinding>
<wsHttpBinding>
<binding name="wsBindingConfig">
<security mode="Transport">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</serviceBehaviors>
</behaviors>
其他提示
我只是尝试进行相同的设置 - 但就我而言,一切似乎都工作得很好。
- ASP.NET 网站
- WCF服务,使用basicHttpBinding,根本不需要任何特殊设置
- 匿名 = 已启用且 Windows 身份验证 = 已启用的 IIS 应用程序(均已打开)
我可以轻松地使用 WcfTestClient 连接到它并检索元数据,然后我可以调用它,没有问题。
在我的服务函数中,我检查当前用户是否是已知用户,它是否被正确识别为 Windows 身份验证用户:
ServiceSecurityContext ssc = ServiceSecurityContext.Current;
if (ssc.IsAnonymous)
{
return "anonymous user";
}
else
{
if(ssc.WindowsIdentity != null)
{
return ssc.WindowsIdentity.Name;
}
if (ssc.PrimaryIdentity != null)
{
return ssc.PrimaryIdentity.Name;
}
}
return "(no known user)";
我真的不知道还需要检查什么(除了我使用的是带有 IIS7 的 Vista)。您是否有机会包含此代码来检查服务代码中的用户?只是去看看....
马克
马克,你的设置是不是甚至接近约翰。
约翰用使用Windows凭据消息模式传输WsHttpBinding的。在Windows身份验证未使用basicHttpBinding的使用。此外,约翰AnonymousAuthentication禁用,这就是为什么元数据交换(MEX)失败。
在通话甚至不会到达服务端功能里面,因为我们得到一个401错误(未授权),当我们试图调用。
刚认识约翰,我也有同样的问题,我想以某种方式建立每个端点单独绑定。希望这将工作。