La requête HTTP N'est pas autorisée avec le client authentication scheme 'Ntlm'. L'en-tête d'authentification reçu du serveur était 'Negotiate, NTLM'

j'ai regardé une tonne de tellement articles, et même d'autres sites, mais ne semble pas pouvoir obtenir ce service fonctionne. J'ai du SAVON pour le service, je suis en train de frapper et qu'il est configuré comme ceci:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
        <binding name="PROVIDERSSoapBinding">
            <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
            </security>
        </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://xxx.xx.xx.xxx:9011/provider/services/PROVIDERS"
            binding="basicHttpBinding" bindingConfiguration="PROVIDERSSoapBinding"
            contract="ServiceReference1.ProviderRemote" name="PROVIDERS" />
    </client>
</system.serviceModel>

Cependant, j'obtiens l'erreur suivante lors de la frappe de mon application console:

la requête HTTP N'est pas autorisée avec le client authentication scheme 'Ntlm'. L'en-tête d'authentification reçu du serveur a été "Negotiate, NTLM".

quelqu'un Peut-il m'aider?

19
demandé sur shytikov 0000-00-00 00:00:00

3 réponses

vous pouvez éliminer le client du problème en utilisant wftech, c'est un vieil outil, mais je l'ai trouvé utile pour diagnostiquer les problèmes d'authentification. wfetch vous permet de spécifier NTLM, Negotiate et kerberos, cela pourrait bien vous aider à mieux comprendre votre problème. Comme vous essayez d'appeler un service et que wfetch ne connaît rien à la WCF, je vous suggère d'appliquer votre "endpoint binding" (PROVIDERSSoapBinding) à la serviceMetadata ensuite, vous pouvez faire une demande HTTP GET de la WSDL pour le service avec les mêmes paramètres de sécurité.

une autre option, qui peut être disponible pour vous est de forcer le serveur à utiliser NTLM, vous pouvez le faire en éditant le métabase (IIS 6) et en supprimant le paramètre de négociation, plus de détails à http://support.microsoft.com/kb/215383.

si vous utilisez IIS 7.x, alors l'approche est légèrement différente, les détails de la façon de configurer les fournisseurs d'authentification sont ici http://www.iis.net/configreference/system.webserver/security/authentication/windowsauthentication.

je remarque que vous avez bloqué l'adresse du serveur avec xxx.xx.xx.xxx, donc je devine que c'est une adresse IP plutôt qu'un nom de serveur, cela peut causer des problèmes d'authentification, donc si possible essayez de cibler le nom de la machine.

désolé que je ne vous ai pas donné la réponse mais plutôt des conseils pour se rapprocher de la question, mais je l'espère aider.

je terminerai en disant que j'ai connu ce même problème et que mon seul recours était D'utiliser Kerberos plutôt que NTLM, n'oubliez pas que vous aurez besoin d'enregistrer un SPN pour le service si vous empruntez cette route.

8
répondu David Martin 2012-12-05 17:57:57

essayez de configurer ' clientCredentialType 'en' Windows 'au lieu de'Ntlm'.

je pense que c'est ce que le serveur attend - i.e. quand il dit que le serveur attend "Negotiate,NTLM", cela signifie en fait Windows Auth, où il va essayer D'utiliser Kerberos si disponible, ou retomber sur NTLM si non (d'où le 'negotiate')

je me base sur une certaine lecture entre les lignes de: sélectionner un type de justificatif d'identité

9
répondu Chamila Chulatunga 2012-12-04 14:40:38

nous avons rencontré ce problème et avons découvert que l'erreur était lancée en utilisant (C'est-à-dire dans notre cas) le navigateur s'est connecté en tant que compte de processus, puis en changeant la session se connecter à travers l'application (SharePoint). Je crois que ce scénario passe deux schémas d'authentification:

  1. Négocier
  2. NTLM

l'application hébergeait un *.asmx web service, qui était appelé sur un serveur de charge équilibrée, l'amorce d'un appel de service web à elle-même en utilisant un WCF-like .NET3.5 binding.

Code qui a été utilisé pour appeler le service web:

public class WebServiceClient<T> : IDisposable
{
    private readonly T _channel;
    private readonly IClientChannel _clientChannel;

    public WebServiceClient(string url)
        : this(url, null)
    {
    }
    /// <summary>
    /// Use action to change some of the connection properties before creating the channel
    /// </summary>
    public WebServiceClient(string url,
         Action<CustomBinding, HttpTransportBindingElement, EndpointAddress, ChannelFactory> init)
    {
        var binding = new CustomBinding();
        binding.Elements.Add(
            new TextMessageEncodingBindingElement(MessageVersion.Soap12, Encoding.UTF8));
        var transport = url.StartsWith("https", StringComparison.InvariantCultureIgnoreCase)
                            ? new HttpsTransportBindingElement()
                            : new HttpTransportBindingElement();
        transport.AuthenticationScheme = System.Net.AuthenticationSchemes.Ntlm;
        binding.Elements.Add(transport);

        var address = new EndpointAddress(url);

        var factory = new ChannelFactory<T>(binding, address);
        factory.Credentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

        if (init != null)
        {
            init(binding, transport, address, factory);
        }

        this._clientChannel = (IClientChannel)factory.CreateChannel();
        this._channel = (T)this._clientChannel;
    }

    /// <summary>
    /// Use this property to call service methods
    /// </summary>
    public T Channel
    {
        get { return this._channel; }
    }
    /// <summary>
    /// Use this porperty when working with
    /// Session or Cookies
    /// </summary>
    public IClientChannel ClientChannel
    {
        get { return this._clientChannel; }
    }

    public void Dispose()
    {
        this._clientChannel.Dispose();
    }
}

nous avons découvert que si le justificatif de session était le même que le compte de processus du navigateur, alors juste NTLM a été utilisé et l'appel a été réussi. Sinon, il en résulterait cette exception capturée:

la requête HTTP N'est pas autorisée avec le client authentication scheme 'Ntlm'. L'en-tête d'authentification reçu du serveur a été "Negotiate, NTLM".

en fin de compte, je suis assez certain que l'un des schémas d'authentification passerait l'authentification tandis que l'autre ne le ferait pas, parce qu'il n'a pas été accordé l'accès approprié.

4
répondu Code Maverick 2014-04-15 15:48:45