如何为基本身份验证配置WCF Web服务,但使用匿名身份验证公开元数据

时间:2014-03-25 16:02:14

标签: wcf soap wsdl

我在IIS中托管了一个WCF SOAP-1.2 Web服务,该服务通过customBinding规范使用HTTP Basic Auth。在开发环境中,它仅使用HTTP。在QA中,它使用HTTP和HTTPS。在prod中,它仅使用HTTPS传输。

现在,WSDL由serviceBehavior标记公开,而不是像这样(使用适当的httpsGetEnabled):

<serviceMetadata httpGetEnabled="true"/>

我想只启用对WSDL /模式的匿名访问,因为它们当前需要Basic Auth和实际服务一样。怎么做到这一点?我在MSDN上进行了挖掘,并发现一些resources指向使用webHttpBinding专门用于元数据,但我似乎无法忘记Basic Auth:

<serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding" httpGetBindingConfiguration="metadatabinding" />
...
<bindings>
  <webHttpBinding>
    <binding name="metadatabinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="None" proxyCredentialType="None"/>
      </security>
    </binding>
  </webHttpBinding>
...
</bindings>

在使用上面调整的元数据标签时,在提起http://someserver/service.svc?wsdl时,我会在浏览器中提示我输入基本凭据(这些名称已经过清理)。

在IIS中,我为站点/应用程序启用了匿名和基本身份验证,以便绑定最终控制凭据要求。

2 个答案:

答案 0 :(得分:1)

糟糕,我实际上没有更改IIS应用程序配置,因为我说我在问题中做了。要使上面的第二个扩展web.config正常工作,您需要在&#34;身份验证&#34;中启用IIS内的匿名基本身份验证。站点或应用程序的一部分,以便在应用程序级别,两者都可用。通过对具有authenticationScheme="Basic"的实际服务使用绑定,对服务进行身份验证,而不提供元数据。

我很惊讶这不是直接记录的;我可以在其他社交网站或SO上找到的最有用的提示建议使用单独的应用程序或静态资源用于WSDL和模式,而不是放松对WCF生成的元数据的访问。

答案 1 :(得分:1)

authenticationScheme属性的更改也对我有用(根据@Greg的回答)。

但是,我有一个自托管服务,因此我将其添加到App.config文件中。

这为serviceMetaData端点定义了HTTPS和基本身份验证:

<behaviors>
  <serviceBehaviors>
    <behavior name="HttpsAndBasicAuthentication" >
      <serviceMetadata httpsGetEnabled="true" httpsGetUrl="https://localhost:8000/CalculatorService" />
      <serviceAuthenticationManager authenticationSchemes="Basic"/>  
    </behavior>
  </serviceBehaviors>
</behaviors>

请注意,必须在<service>元素中使用behaviorConfiguration属性引用此行为。

相关问题