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

Posted

技术标签:

【中文标题】WCF - Windows 身份验证 - 安全设置需要匿名【英文标题】:WCF - Windows authentication - Security settings require Anonymous 【发布时间】:2010-11-04 20:09:28 【问题描述】:

我正在努力让 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>

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

【问题讨论】:

这个问题应该确定它使用的是哪个版本的 IIS。 也参考***.com/questions/9588265/… 【参考方案1】:

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

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

您也可以在 IIS 中启用匿名访问,并在您的 web.config 中确保匿名访问被拒绝。

希望这会帮助其他人。 (我 100% 确定我在删除 mex 的情况下尝试过。:-O)

【讨论】:

我最终使用了您的替代方案。 IIS anon + Windows 与 web.config 拒绝所有匿名用户。我正在使用 asp.net 托管 3.5 WCF REST。谢谢 按照我在此处找到的步骤后,这对我有用:link,我从这里被定向到:link@Andrey【参考方案2】:

您可以查看此one。 我设法让它按预期工作。

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

【讨论】:

感谢您提供信息 - 在此处引用信息的相关部分比提供简单的超链接会更有帮助。【参考方案3】:

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

所以改变你当前的配置:

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

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

应该可以解决问题

【讨论】:

谢谢!这对我有用,但为了清楚起见,我还必须保留httpGetEnabled="true" 使用 basicHttpBinding 为我工作。即将“mex”端点上的绑定从“mexHttpBinding”更改为“basicHttpBinding”【参考方案4】:

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

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

我有相同的工作环境,这些环境的唯一区别是服务的身份验证。在我的情况下,问题不是由选定的提供商(Ntlm 或 Negotiate)引起的,而是由站点和服务的身份验证设置引起的。

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

所以在我的情况下,问题不是通过对 web.config 或 ApplicationHost.config 文件进行任何特殊编辑来解决,我没有对配置文件进行任何编辑。只需为网站选择正确的身份验证设置,并在 IIS 管理器中提供服务。我不确定这里是不是这样,但也许值得一试?

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

是的,您似乎需要完全删除 mex 端点。设置

<serviceMetadata httpGetEnabled="false"/>

单独是行不通的。谢谢!

【讨论】:

【参考方案7】:

其他解决方案:

您只需确保服务名称和合同正确无误。

希望它在某些方面有所帮助。

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于WCF - Windows 身份验证 - 安全设置需要匿名的主要内容,如果未能解决你的问题,请参考以下文章

WCF 客户端证书验证 + Windows 身份验证

没有身份验证的 WCF 传输安全性

使用 RESTful WCF 和 Windows 窗体的用户/通过身份验证

在带有 WCF 的 App.config 中使用 Windows 角色身份验证

WCF 托管在 IIS6 上

在 WCF 和 Windows 身份验证中处理 CORS