1

使用 C# 中的控制台应用程序调用 lists.asmx 获取'http 请求是未经授权的客户端验证方案'ntlm'。从服务器收到的身份验证标头是“协商,NTLM”。

环境:

  • Kerberos 在 QA 和生产中打开,而不是在开发中(我知道很愚蠢,但我不管理任何盒子)
  • 点击共享点网络服务以从共享点列表 (lists.asmx) 获取数据。
  • 服务器使用 ssl。

我在我的 qa 环境中收到如下错误消息(无法粘贴堆栈跟踪,因为它仅在图片中):

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Ntlm'. The authentication header received from the server was 'Negotiate,NTLM'. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized.

在每台机器上直接导航到列表都可以正常工作。

  • 代码在没有启用 kerberos 的开发环境(在服务器上)中工作(应该是,但不是。我不能改变这个)。
  • 代码适用于启用了 kerberos 的台式机的生产
  • 代码在启用了 kerberos 的 QA 环境中不起作用。这是我得到错误的地方

要调用网络服务,我会这样做(不涉及其他与安全相关的代码)

XmlElement element = this.LIstsServiceClient.GetListItems(listName, '', query, fields, '300', null, null);

我的 app.config 如下

    <configuration>
    <system.serviceModel>
      <behaviors>
        <endpointBehaviors>
          <behavior name="clientEndpointBehavior">
            <clientCredentials>
              <windows allowedImpersonationLevel="Delegation"/>
            </clientCredentials>
          </behavior>
        </endpointBehaviors>
      </behaviors>
      <bindings>
            <basicHttpBinding>
                <binding name="ListsSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="999999999" maxBufferPoolSize="524288" maxReceivedMessageSize="999999999"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="999999" maxNameTableCharCount="16384" />
                    <security mode="Transport">
                      <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" realm="" />
                      <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
</basicHttpBinding>
<client>
         <endpoint address="https://servername/sitecollectionname/_vti_bin/Lists.asmx"
              binding="basicHttpBinding" bindingConfiguration="ListsSoap"
              contract="ListsService.ListsSoap" name="ListsSoap" behaviorConfiguration="clientEndpointBehavior"  >
            <identity>
              <servicePrincipalName value="spn" />
            </identity>
          </endpoint>
</client>
    </system.serviceModel>
</configuration>
4

5 回答 5

2

看看这里

启用匿名访问(域用户的用户名和密码) 启用集成 Windows 身份验证

或者,正如 lextm-MSFT 所说,检查您是否传递了一组有效的用户凭据

于 2009-10-21T07:31:42.723 回答
1

我解决了问题:

把这是配置

<system.serviceModel>
    <bindings />
    <client />
</system.serviceModel>
于 2011-11-21T12:46:28.413 回答
0

这只是身份验证失败。检查您的控制台应用程序是否向托管此 Web 服务的 IIS 发送了有效的用户凭据。

于 2009-10-21T07:25:27.557 回答
0

我从来没有设法找到这个问题的答案,但主要是因为我无法访问一致配置的环境,因此我无法调试我的代码。我认为这个问题是配置问题,可能与 Kerberos 相关。

于 2009-11-12T09:55:54.203 回答
0

我通过允许在客户端端点上进行模拟来解决这个问题,Lists 服务似乎需要它接收的第一个请求(可能取决于您正在调用的 Web 方法)。令人困惑的是,Lists 服务将在内部执行身份验证和验证,如果失败,则生成 401 或 500 响应,这使得您的请求在访问服务之前似乎在 IIS 中失败,而实际上,服务方法正在执行并返回错误.

<behaviors>
   <endpointBehaviors>
      <behavior name="SPServiceBehavior">
          <clientCredentials>
                <windows allowedImpersonationLevel="Impersonation" allowNtlm="True"/>
          </clientCredentials>
      </behavior>
   </endpointBehaviors>
</behaviors>

有关所有详细信息,请在此处查看我的问题。

于 2014-03-17T15:27:25.583 回答