IIS在IIS + TransportCredentialOnly / Windows auth的basicHttpBinding中托管WCF服务+ Windows身份验证

时间:2008-10-20 16:58:23

标签: wcf iis

我想创建一个在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?为什么呢?

4 个答案:

答案 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)
{...}