代码之家  ›  专栏  ›  技术社区  ›  Rashack

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

  •  43
  • Rashack  · 技术社区  · 15 年前

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

    此服务的安全设置需要“匿名”身份验证,但没有为承载此服务的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 回复  |  直到 7 年前
        1
  •  42
  •   Rashack    9 年前

    所以这似乎是很常见的问题。重点是从绑定中删除MEX:

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

    或者,在IIS中启用匿名访问,在web.config中确保拒绝匿名访问。

    希望这能帮助其他灵魂。 (我百分之百肯定我尝试过去除mex。:-O)

        2
  •  14
  •   John Gietzen    13 年前

    你可以查一下这个 one . 我设法使它按预期工作。

    <configuration>
      ...
      <system.serviceModel>
        ...
        <bindings>
          <basicHttpBinding>
            <binding>
              <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Windows" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
        ...
      </system.serviceModel>
      ...
    </configuration>
    
        3
  •  11
  •   sandyiit    13 年前

    也可以使用您的MEX服务绑定。

    因此,更改当前配置:

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

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

    这应该解决问题

        4
  •  2
  •   Atte    11 年前

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

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

    我有相同的工作环境,在这些环境中唯一的区别是服务的身份验证。在我的案例中,问题不是由选定的提供程序(NTLM或协商)引起的,而是由站点和服务的身份验证设置引起的。

    至少我与基本的MSSQL Master Data Services网站和服务有相同的错误消息,这就是解决方案。我在运行服务时确实收到了错误,但站点运行几乎正常,MDS资源管理器不工作,因为服务的身份验证设置一开始是错误的。此配置丢失的原因可能是创建新的MDS站点时MDS配置管理器中的错误?

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

        5
  •  1
  •   Sagar S.    11 年前

    当我删除“mex”端点并设置clientCredentialType='ntlm'时,它对我很有用。 我在SharePoint中托管WCF。

        6
  •  0
  •   Narayana    14 年前

    是的,看起来您需要完全删除MEX端点。设置

    <serviceMetadata httpGetEnabled="false"/>
    

    一个人不行。谢谢!

        7
  •  0
  •   SyntaxError    12 年前

    其他解决方案:

    您只需确保服务名称和合同是正确的。

    希望能有所帮助。

        8
  •  0
  •   csrowell Andrei Rantsevich    7 年前

    此MEX绑定问题似乎已在.NET 4.0中修复。将服务器的app pool.net clr版本从2.0更改为4.0,解决了这个问题。