49 votes

Services Web Sharepoint - La demande HTTP n'est pas autorisée avec le schéma d'authentification client 'Ntlm'. L'en-tête d'authentification reçu du serveur était 'NTLM'

Je sais qu'il y a beaucoup de questions sur SI semblable à cela, mais je ne pouvais pas en trouver un pour ce problème particulier.

Un couple de points, d'abord:

  • J'ai aucun contrôle sur notre serveur Sharepoint. Je ne peux pas modifier un des paramètres IIS.
  • Je crois que notre serveur IIS version d'IIS 7.0.
  • Notre Serveur Sharepoint est d'anticiper les demandes via NTLM.
  • Notre Serveur Sharepoint est sur le même domaine que mon ordinateur client.
  • Je suis à l'aide .NET Framework 3.5, Visual Studio 2008

Je suis en train d'écrire une application console simple à manipuler des données Sharepoint à l'aide de Services Web Sharepoint. J'ai ajouté la Référence de Service, et celle-ci est l'une de mes applications.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>

C'est mon code:

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

Quand je l'appelle GetListCollection(), la suite de MessageSecurityException est lancée:

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

Avec un intérieur WebException:

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

J'ai essayé différentes liaisons et divers code des astuces pour essayer de s'authentifier correctement, mais en vain. Je vais faire une liste de celles ci-dessous.


J'ai essayé les étapes suivantes:

À l'aide d'un natif Win32 Imitateur d'avant la création du client

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

Cela produit le même message d'erreur.


Réglage TokenImpersonationLevel pour mon client les informations d'identification

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

Cela produit le même message d'erreur.


En utilisant le mode de sécurité=TransportCredentialOnly

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

Il en est résulté dans un autre message d'erreur:

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

Cependant, j'ai besoin d'utiliser le protocole https, donc je ne peux pas modifier mon schéma d'URI.


J'ai essayé d'autres combinaisons que je ne me souviens pas, mais je vais les poster quand je fais les. Je suis vraiment à bout de ressources ici. Je vois beaucoup de liens sur Google que de dire "passer à Kerberos", mais mon serveur semble être la seule à accepter de NTLM, pas de "Négocier" (comme il dirait si elle était à la recherche pour Kerberos), donc ce n'est malheureusement pas une option.

Aucune aide là-bas, les gens?

40voto

Kit Menke Points 4573

Visual Studio 2005

  1. Créez un nouveau projet application console dans Visual Studio
  2. Ajoutez une Référence Web" pour les Listes.service web asmx.
    • Votre URL sera probablement ressembler à: http://servername/sites/SiteCollection/SubSite/_vti_bin/Lists.asmx
    • J'ai appelé mon web de référence: ListsWebService
  3. Écrire le code dans le programme.cs (j'ai une liste de Problèmes ici)

Voici le code.

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. Créez un nouveau projet application console dans Visual Studio
  2. Cliquez du bouton droit sur Références et d'Ajouter une Référence de Service
  3. Mettre dans l'URL pour les Listes.asmx service sur votre serveur
    • Ex: http://servername/sites/SiteCollection/SubSite/_vti_bin/Lists.asmx
  4. Cliquez Sur Go
  5. Cliquez sur OK
  6. Faire les modifications de code suivantes:

Changement de votre application.fichier de configuration à partir de:

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

Pour:

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

Modifiez votre programme.cs fichier et ajoutez le code suivant à votre fonction Principale:

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();

Ajouter les instructions d'utilisation:

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

Référence: http://sharepointmagazine.net/technical/development/writing-caml-queries-for-retrieving-list-items-from-a-sharepoint-list

8voto

Pandincus Points 5785

Après beaucoup d'essais et d'erreur, suivi par une stagnation de la période, tandis que j'attendais une occasion de parler avec notre serveur les gars, j'ai enfin eu la chance de discuter le problème avec eux et leur a demandé s'ils n'ont pas l'esprit de la commutation de nos Sharepoint authentification sur Kerberos.

À ma grande surprise, ils ont dit que ce ne serait pas un problème, il a été facile à faire. Ils ont permis de Kerberos et j'ai modifié mon application.config comme suit:

<security mode="Transport">
    <transport clientCredentialType="Windows" />
</security>

Pour référence, mon serviceModel entrée dans mon application.config ressemble à ceci:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="TestServerReference" closeTimeout="00:01:00" openTimeout="00:01:00"
             receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
             bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
             maxBufferSize="2000000" maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000"
             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="Windows" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://path/to/site/_vti_bin/Lists.asmx"
         binding="basicHttpBinding" bindingConfiguration="TestServerReference"
         contract="TestServerReference.ListsSoap" name="TestServerReference" />
    </client>
</system.serviceModel>

Après cela, tout a fonctionné comme un charme. Je peux maintenant (enfin!) utiliser les Services Web Sharepoint. Donc, si quelqu'un d'autre ne peuvent pas obtenir leurs Services Web Sharepoint pour le travail avec NTLM, voir si vous pouvez convaincre les administrateurs système pour basculer sur Kerberos.

5voto

David Anderson Points 21

Après de nombreuses réponses qui n'ont pas de travail, j'ai enfin trouvé une solution lors de l'accès Anonyme est Désactivé sur le serveur IIS. Notre serveur utilise l'authentification Windows, pas de Kerberos. C'est grâce à ce blogue.

Aucune modification n'a été faite sur le web.config.

Sur le côté serveur, l' .SVC fichier dans le dossier ISAPI utilise MultipleBaseAddressBasicHttpBindingservicehostfactory

Les attributs de classe du service sont:

[BasicHttpBindingServiceMetadataExchangeEndpointAttribute]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class InvoiceServices : IInvoiceServices
{
...
}

Sur le côté client, la clé qui fait le travail était la liaison http attributs de sécurité:

EndpointAddress endpoint =
  new EndpointAddress(new Uri("http://SharePointserver/_vti_bin/InvoiceServices.svc"));
BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
InvoiceServicesClient myClient = new InvoiceServicesClient(httpBinding, endpoint);
myClient.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

(call service)

J'espère que cela fonctionne pour vous!

3voto

Jesse C. Slicer Points 11750

Si je me souviens bien, l'ajout de services Web SharePoint en tant que "Référence de service" VS2K8 pose certains problèmes. Vous devez l'ajouter en tant que "référence Web" à l'ancienne pour fonctionner correctement.

2voto

diadem Points 435

J'ai eu exactement le même problème la semaine dernière - http://stackoverflow.com/questions/3197484/wcf-program-behaves-strangely-on-one-server-why

Pour moi la solution était assez simple. Sharepoint a son propre ensemble d'autorisations. Mon client a essayé de se connecter en tant qu'utilisateur qui n'est pas donné explicitement l'accès au webservice via Sharepoint du panneau d'administration.

J'ai ajouté à l'utilisateur de Sharepoint, liste blanche et bang juste que cela fonctionne.

Même si ce n'est pas le problème, veuillez noter que

La requête HTTP est autorisée avec le schéma d'authentification client ‘Ntlm". L'en-tête d'authentification reçues du serveur a été "NTLM".

Moyens (en anglais) que vous simplement n'avez pas la permission. Votre protocole est probablement bouton droit de votre utilisateur n'a pas les permissions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X