我在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中,我为站点/应用程序启用了匿名和基本身份验证,以便绑定最终控制凭据要求。
答案 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
属性引用此行为。