元数据请求需要在WCF中进行身份验证,即使服务描述页面没有

时间:2011-04-01 13:11:23

标签: wcf wcf-security

我已使用以下配置设置WCF服务以要求NTLM身份验证:

<system.serviceModel>
    <bindings>
        <customBinding>
            <binding name="BinarySecurityBinding">
                <binaryMessageEncoding/>
                <httpTransport authenticationScheme="Ntlm"/>
            </binding>
        </customBinding>
    </bindings>

    <services>
        <service name="Services.LogisticsServices" behaviorConfiguration="ServiceBehavior">
            <endpoint address="" binding="customBinding" bindingConfiguration="BinarySecurityBinding" contract="Services.ILogisticsServices" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>

    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

我这样做是为了让使用Web服务的应用程序被强制登录,因为我的所有服务操作都使用模拟([OperationBehavior(Impersonation = ImpersonationOption.Required)])。

在IIS 7中,我启用了匿名和Windows身份验证。

当我访问承载上述服务的http://test.server/LogisticsServices.svc时,我可以匿名查看默认服务描述页面。但是,当Visual Studio尝试访问http://test.server/LogisticsServices.svc/$metadata以生成客户端代理时,服务器正在使用HTTP代码401进行响应并期望进行身份验证。我不仅希望匿名提供元数据,而且服务器不接受我提供的凭据(即使我知道它们是正确的)。

测试不同的配置,我尝试从绑定的传输中删除authenticationScheme,只是为了能够生成客户端代理,但这会导致异常,因为服务的操作需要模拟([OperationBehavior(Impersonation = ImpersonationOption.Required)]

我的服务配置中缺少哪些内容可以匿名提供服务的元数据?如果我接近整个错误,我也愿意接受建议。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

解决此问题的一种方法是不使用自动生成的代理。

如果我们控制服务器和客户端,我们发现避免使用自动生成的代理会更有效率。

有关如何执行此操作的截屏视频,请访问:http://www.dnrtv.com/default.aspx?showNum=122

您可以尝试命令式而非声明性模型,请参阅:http://msdn.microsoft.com/en-us/library/ms730088.aspx