Die HTTP-Anfrage ist mit dem Client-Authentifizierungsschema 'Ntlm' nicht autorisiert. Der vom Server empfangene Authentifizierungs-Header war 'NTLM'.

Ich weiß, es gibt viele Fragen, die SO ähnlich wie diese, aber ich konnte nicht finden eine für dieses bestimmte Problem.

Ein paar Punkte, Erstens:

  • Ich habe keine Kontrolle über unsere Sharepoint-server. Ich kann nicht zwicken IIS-Einstellungen.
  • Ich glaube, dass unsere server, IIS-version IIS 7.0.
  • Unsere Sharepoint-Server erwartet Anfragen per NTLM.
  • Unsere Sharepoint-Server in der gleichen Domäne wie meine client-computer.
  • Ich bin mit .NET Framework 3.5, Visual Studio 2008

Ich bin versucht zu schreiben, eine einfache Konsolen-app zu manipulieren, um Sharepoint-Daten mithilfe der Sharepoint-Web-Services. Ich habe die Service-Referenz, und das folgende ist meine 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>

Dies ist mein code:

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

Wenn ich Anrufe, GetListCollection(), die folgenden MessageSecurityException erhält geworfen:

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

Mit einer inneren WebException:

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

Ich habe versucht, verschiedene Bindungen und verschiedene code-Optimierungen, um zu versuchen, sich zu authentifizieren, richtig, aber ohne Erfolg. Ich werde eine Liste derjenigen, die weniger.


Ich habe versucht, die folgenden Schritte:

Mit einem nativen Win32-Imitator vor dem erstellen der client -

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

Diese produziert die gleiche Fehlermeldung.


Einstellung TokenImpersonationLevel für meine client-Anmeldeinformationen

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

Diese produziert die gleiche Fehlermeldung.


Mit security mode=TransportCredentialOnly

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

Dies führte zu einer anderen Fehlermeldung:

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

Allerdings brauche ich für die Verwendung von https, also kann ich nicht ändern, meine URI-Schema.


Ich habe versucht, einige andere Kombinationen, ich kann mich nicht erinnern, aber ich poste Sie wenn ich. Ich bin echt mit Latein am Ende, hier. Ich sehe eine Menge von links auf Google, die sagen, "wechseln Sie auf Kerberos", aber mein server scheint nur akzeptieren NTLM, nicht "Aushandeln" (wie er sagen würde, wenn er war auf der Suche für Kerberos), das ist also leider keine option.

Jede Hilfe, draußen, Leute?

InformationsquelleAutor der Frage Pandincus | 2010-04-09

Schreibe einen Kommentar