gpt4 book ai didi

c# - HTTP 请求未经授权,客户端身份验证方案为 'Ntlm' 从服务器收到的身份验证 header 为 'NTLM'

转载 作者:IT王子 更新时间:2023-10-29 03:50:39 29 4
gpt4 key购买 nike

我知道有很多关于 SO 的问题与此类似,但我找不到针对这个特定问题的问题。

首先有几点:

  • 无法控制我们的 Sharepoint 服务器。我无法调整任何 IIS 设置。
  • 我相信我们的 IIS 服务器版本是 IIS 7.0。
  • 我们的 Sharepoint Server 正在等待通过 NTLM 发出的请求。
  • 我们的 Sharepoint Server 与我的客户端计算机位于同一域中。
  • 我正在使用 .NET Framework 3.5、Visual Studio 2008

我正在尝试编写一个简单的控制台应用程序来使用 Sharepoint Web 服务来操作 Sharepoint 数据。我添加了服务引用,以下是我的 app.config:

<system.serviceModel>
<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="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://subdomain.companysite.com/subsite/_vti_bin/Lists.asmx"
binding="basicHttpBinding" bindingConfiguration="ListsSoap"
contract="ServiceReference1.ListsSoap" name="ListsSoap" />
</client>
</system.serviceModel>

这是我的代码:

static void Main(string[] args)
{
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain");
client.GetListCollection();
}
}

当我调用 GetListCollection() 时,将抛出以下 MessageSecurityException:

The HTTP request is unauthorized with client authentication scheme 'Ntlm'.
The authentication header received from the server was 'NTLM'.

使用内部 WebException:

"The remote server returned an error: (401) Unauthorized."

我尝试了各种绑定(bind)和各种代码调整以尝试正确验证,但无济于事。我将在下面列出这些。


我尝试了以下步骤:

在创建客户端之前使用 native Win32 Impersonator

using (new Impersonator.Impersonator("username", "password", "domain"))
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("dpincas", "password", "domain");
client.GetListCollection();
}

这产生了相同的错误消息。


为我的客户端凭证设置 TokenImpersonationLevel

using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
client.GetListCollection();
}

这产生了相同的错误消息。


使用安全模式=TransportCredentialOnly

<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>

这导致了不同的错误消息:

The provided URI scheme 'https' is invalid; expected 'http'.
Parameter name: via

但是,我需要使用 https,所以我无法更改我的 URI 方案。


我试过其他一些我不记得的组合,但我会在记得时发布它们。我真的无计可施。我在谷歌上看到很多链接都说“切换到 Kerberos”,但我的服务器似乎只接受 NTLM,而不是“协商”(如果它正在寻找 Kerberos 会说),所以很遗憾,这不是一个选项.

有什么帮助吗,伙计们?

最佳答案

Visual Studio 2005

  1. 在 Visual Studio 中创建一个新的控制台应用程序项目
  2. 向 Lists.asmx 网络服务添加“网络引用”。
    • 您的 URL 可能如下所示:http://servername/sites/SiteCollection/SubSite/_vti_bin/Lists.asmx
    • 我将我的 Web 引用命名为:ListsWebService
  3. 在 program.cs 中编写代码(我这里有一个问题列表)

这是代码。

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace WebServicesConsoleApp
{
class Program
{
static void Main(string[] args)
{
try
{
ListsWebService.Lists listsWebSvc = new WebServicesConsoleApp.ListsWebService.Lists();
listsWebSvc.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
listsWebSvc.Url = "http://servername/sites/SiteCollection/SubSite/_vti_bin/Lists.asmx";
XmlNode node = listsWebSvc.GetList("Issues");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}

Visual Studio 2008

  1. 在 Visual Studio 中创建一个新的控制台应用程序项目
  2. 右键单击 References 并添加服务引用
  3. 在您的服务器上输入 Lists.asmx 服务的 URL
    • 例如:http://servername/sites/SiteCollection/SubSite/_vti_bin/Lists.asmx
  4. 点击开始
  5. 点击确定
  6. 进行以下代码更改:

更改您的 app.config 文件:

<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

收件人:

<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm"/>
</security>

更改您的 program.cs 文件并将以下代码添加到您的 Main 函数:

ListsSoapClient client = new ListsSoapClient();
client.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
XmlElement listCollection = client.GetListCollection();

添加using语句:

using [your app name].ServiceReference1;
using System.Xml;

引用:http://sharepointmagazine.net/technical/development/writing-caml-queries-for-retrieving-list-items-from-a-sharepoint-list

关于c# - HTTP 请求未经授权,客户端身份验证方案为 'Ntlm' 从服务器收到的身份验证 header 为 'NTLM',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2608887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com