3

我的服务是在 IIS7 上使用 Windows 身份验证启用的。

    <binding name="Soap.HttpsBinding" closeTimeout="00:05:00"
             openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:05:00">
      <security mode="Transport">
        <transport clientCredentialType="Windows" proxyCredentialType="None">
          <extendedProtectionPolicy policyEnforcement="WhenSupported" />
        </transport>
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>

我的客户使用相同的绑定详细信息成功连接到它。

我最近请求添加基本身份验证以支持某些遗留系统。我以为我知道的一切都表明我们可以并肩作战。

我启用了基本身份验证,旧系统可以连接。但是,我们所有现有的 WCF 客户端现在都抛出以下异常:

MessageSecurityException:HTTP 请求未经客户端身份验证方案“协商”的授权。从服务器收到的身份验证标头是“Basic realm="mydomain.local",Negotiate,NTLM'。

  1. 为什么 Basic 在模块列表中位于其他模块下方时首先列出?
  2. 为什么客户没有失败 Basic 并转向 Negotiate?(当然它们不必相同)
  3. 如何在同一个 WCF 服务上同时支持 Basic 和 Windows 身份验证?

问候,罗布。

4

1 回答 1

1

好的,事实证明这是我遇到的更具误导性的 Microsoft 错误消息之一。

在初始请求中创建 401 身份验证错误,事件查看器中没有记录任何异常。

答案似乎是使用 system.webServer -> httpErrors

因为我想在 URL 中使用波浪号 (~),所以我将我的配置设置为以下内容:

<httpErrors>
  <clear />
  <error statusCode="401" responseMode="ExecuteURL" path="~/error.xml" />
</httpErrors>

无论是使用波浪号,还是 ExecuteURL,我最终发现使用以下作品:

<httpErrors>
  <clear />
  <error statusCode="401" responseMode="File" path="/error.xml" />
</httpErrors>
于 2013-11-20T11:05:02.523 回答