我想创建一个在IIS6中托管的WCF服务,并在IIS中禁用匿名身份验证。并且不要使用SSL。
所以我唯一的方法是使用basic {HttpBinging TransportCredentialOnly
,不是吗?
我创建了一个虚拟目录,设置了Windows Integrated Auth并取消选中“启用匿名访问”。
这是我的web.config:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="MyBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="Samples.ServiceFacadeService" behaviorConfiguration="ServiceFacadeServiceBehavior">
<endpoint address="" binding="basicHttpBinding" bindingName="MyBinding"
contract="Samples.IServiceFacadeService">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceFacadeServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
您可以看到我甚至没有将MEX-enpoint包含在元数据交换中。使用TransportCredentialOnly安全性只需一个端点和一个绑定。
但是当我尝试启动服务(通过客户端代理调用方法)时,我在EventLog中遇到了这样的异常:
例外: System.ServiceModel.ServiceActivationException: 服务 '/wcftest/ServiceFacadeService.svc' 由于a无法激活 编译期间的异常。该 异常消息是:安全性 此服务的设置需要 '匿名'身份验证,但确实如此 未启用IIS应用程序 托管这项服务.. ---&gt; System.NotSupportedException:安全性 此服务的设置需要 '匿名'身份验证,但确实如此 未启用IIS应用程序 托管这项服务。
我不知道为什么我的服务需要Anonymous auth?为什么呢?
答案 0 :(得分:8)
答案发现了jezell。谢谢。 我混合了bindingName和bindingConfiguration:
<endpoint address="" binding="basicHttpBinding" bindingName="MyBinding"
contract="Samples.IServiceFacadeService">
</endpoint>
那是对的:
<endpoint address="" binding="basicHttpBinding" **bindingConfiguration**="MyBinding"
contract="Samples.IServiceFacadeService">
</endpoint>
答案 1 :(得分:7)
MEX端点可能仍然是问题(请参阅此post)。尝试禁用这样的MEX:
<services>
<!-- Note: the service name must match the configuration name for the service implementation. -->
<service name="MyNamespace.MyServiceType" behaviorConfiguration="MyServiceTypeBehaviors" >
<!-- Add the following endpoint. -->
<!-- Note: your service must have an http base address to add this endpoint. -->
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors" >
<!-- This disables it. -->
<serviceMetadata httpGetEnabled="false" />
</behavior>
</serviceBehaviors>
</behaviors>
这是保护MEX的好post。
答案 2 :(得分:3)
对mex端点使用basicHttpBinding并应用相同的bindingConfiguration:
答案 3 :(得分:1)
要使VS wcf服务项目(新示例项目)在IIS下使用身份验证,您必须:
1)允许在IIS中进行匿名访问 2)使用如下属性前缀您的公共方法:
[PrincipalPermission(SecurityAction.Demand, Role = "MyADGroup")]
public string SendMyMessage(string Message)
{...}