首页 文章

WCF - Windows身份验证 - 安全设置需要匿名

提问于
浏览
43

我正努力在我们的服务器上运行IIS上运行WCF服务 . 部署后,我最终收到一条错误消息:

此服务的安全设置需要'Anonymous'身份验证,但不会为承载此服务的IIS应用程序启用它 .

我想使用Windows身份验证,因此我禁用了匿名访问 . 另请注意,有aspNetCompatibilityEnabled(如果这有任何区别) .

这是我的web.config:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <bindings>
        <webHttpBinding>
            <binding name="default">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" proxyCredentialType="Windows"/>
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
    <behaviors>
        <endpointBehaviors>
            <behavior name="AspNetAjaxBehavior">
                <enableWebScript />
                <webHttp />
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="defaultServiceBehavior">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
                <serviceDebug includeExceptionDetailInFaults="true" />
                <serviceAuthorization principalPermissionMode="UseWindowsGroups" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service name="xxx.Web.Services.RequestService" behaviorConfiguration="defaultServiceBehavior">
            <endpoint behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding"
             contract="xxx.Web.Services.IRequestService" bindingConfiguration="default">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"></endpoint>
        </service>
    </services>
</system.serviceModel>

我在互联网上搜索没有运气 . 任何线索都非常感谢 .

8 回答

  • 0

    所以这似乎是很常见的问题 . 关键是从绑定中删除mex:

    <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"></endpoint>
    

    或者,您可以在IIS和web.config中启用匿名访问,以确保拒绝匿名访问 .

    希望这会有助于其他一些灵魂 . (我100%肯定我尝试用mex删除 . : - O)

  • 0

    你可以查看one . 我设法让它按预期工作 .

    <configuration>
      ...
      <system.serviceModel>
        ...
        <bindings>
          <basicHttpBinding>
            <binding>
              <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Windows" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
        ...
      </system.serviceModel>
      ...
    </configuration>
    
  • 0

    只需将您的服务绑定用于mex .

    所以改变你当前的配置:

    <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"></endpoint>
    

    <endpoint address="mex" binding="webHttpBinding" bindingConfiguration="default" name="mex" contract="IMetadataExchange"></endpoint>
    

    那应该可以解决问题

  • 1

    匿名身份验证可以,并且在某些情况下必须为服务启用,但不能为站点启用 .

    因此,请检查您站点的“root”身份验证是否仅启用了Windows身份验证 . 然后展开您的站点,选择“服务”文件夹并确保您的服务启用了Windows和匿名身份验证 .

    我有相同的环境,这是有效的,只有这些环境的差异是服务的身份验证 . 在我的情况下问题不是选择提供商(Ntlm或Negotiate),而是网站和服务的身份验证设置 .

    至少我与基本的MSSQL Master Data Services网站和服务有相同的错误信息,这就是解决方案 . 我在运行该服务时确实收到了错误,但该网站工作正常,MDS Explorer无法正常工作,因为服务的身份验证设置最初是错误的 . 在创建新的MDS站点时,这种错误配置的原因可能是MDS配置管理器中的错误?

    所以在我的情况下,问题是不能通过对web.config和ApplicationHost.config文件进行任何特殊编辑来修复,我没有对配置文件进行任何编辑 . 刚刚为IIS管理器中的网站及其服务选择了正确的身份验证设置 . 我不确定这是这种情况,但也许值得一试?

  • 2

    当我删除'mex' endpoints 并设置clientCredentialType ='Ntlm'时,它对我有用 . 我在SharePoint中托管我的WCF .

  • 11

    是的,看起来您需要完全删除mex endpoints . 设置

    <serviceMetadata httpGetEnabled="false"/>
    

    一个人没有用 . 谢谢!

  • 14

    附加解决方案

    您只需确保服务名称和 Contract 正确无误 .

    希望它在某种程度上有所帮助 .

  • 42

    看起来这个MEX绑定问题在.NET 4.0中得到了修复 . 将我们服务器的App Pool .NET CLR版本从2.0更改为4.0可以解决问题 .

相关问题