webentwicklung-frage-antwort-db.com.de

Die HTTP-Anforderung ist mit dem Clientauthentifizierungsschema 'Negotiate' nicht autorisiert. Der vom Server empfangene Authentifizierungsheader war "NTLM".

Vor einigen Tagen hatte ich große Probleme mit Authentifizierungsproblemen bei der Verwendung von Windows-Authentifizierung zwischen Client- und WCF-Webdienst . Der Fehler, den ich erhielt, war "Die HTTP-Anforderung ist mit dem Clientauthentifizierungsschema" Negotiate "nicht autorisiert. Der vom Server empfangene Authentifizierungsheader lautete" NTLM ". Keine der Lösungen auf Stack funktionierte, da die meisten von ihnen mit alten Methoden in Zusammenhang standen.

34

THE ANSWER: Das Problem war, dass alle Beiträge für ein solches Problem mit älteren Kerberos und IIS Problemen zu tun hatten, bei denen Proxy-Anmeldeinformationen oder AllowNTLM-Eigenschaften hilfreich waren. Mein Fall war anders. Nach stundenlanger Suche nach Würmern habe ich festgestellt, dass etwas IIS die Installation Negotiate provider unter IIS Liste der Windows-Authentifizierungsanbieter nicht enthielt. Also musste ich es hinzufügen und aufsteigen. Mein WCF-Dienst wurde wie erwartet authentifiziert. Hier ist der Screenshot, wie er aussehen sollte, wenn Sie die Windows-Authentifizierung mit Anonymous auth OFF verwenden.

Sie müssen mit der rechten Maustaste auf die Windows-Authentifizierung klicken und das Menüelement Anbieter auswählen.

enter image description here

Hoffe, das hilft, etwas Zeit zu sparen.

24

Ich habe meine ältere Version von WCF auf WCF 4 mit folgenden Änderungen aktualisiert. Ich hoffe, Sie können auch ähnliche Änderungen vornehmen.

1. Web.config:

<system.serviceModel>
      <bindings>
        <basicHttpBinding>
          <binding name="Demo_BasicHttp">
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="InheritedFromHost"/>
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>
      <services>
        <service name="DemoServices.CalculatorService.ServiceImplementation.CalculatorService" behaviorConfiguration="Demo_ServiceBehavior">
          <endpoint address="" binding="basicHttpBinding"
              bindingConfiguration="Demo_BasicHttp" contract="DemoServices.CalculatorService.ServiceContracts.ICalculatorServiceContract">
            <identity>
              <dns value="localhost"/>
            </identity>
          </endpoint>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="Demo_ServiceBehavior">
            <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
            <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
            <serviceDebug includeExceptionDetailInFaults="false"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <protocolMapping>
        <add scheme="http" binding="basicHttpBinding" bindingConfiguration="Demo_BasicHttp"/>
      </protocolMapping>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

2. App.config:

    <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ICalculatorServiceContract" maxBufferSize="2147483647" maxBufferPoolSize="33554432" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" sendTimeout="00:10:00" receiveTimeout="00:10:00">
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="4096" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:24357/CalculatorService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICalculatorServiceContract" contract="ICalculatorServiceContract" name="Demo_BasicHttp" />
    </client>
  </system.serviceModel>
6
Ajay Shankar

Für mich war die Lösung außerdem "Ntlm" als Anmeldeinformationstyp:

    XxxSoapClient xxxClient = new XxxSoapClient();
    ApplyCredentials(userName, password, xxxClient.ClientCredentials);

    private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials)
    {
        clientCredentials.UserName.UserName = userName;
        clientCredentials.UserName.Password = password;
        clientCredentials.Windows.ClientCredential.UserName = userName;
        clientCredentials.Windows.ClientCredential.Password = password;
        clientCredentials.Windows.AllowNtlm = true;
        clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
    }  
3
Sander Postma

Nicht genau dieses Problem, aber dies ist das beste Ergebnis, wenn Sie für fast denselben Fehler googeln []: 

Wenn dieses Problem beim Aufrufen eines WCF-Diensts auf demselben Computer auftritt, müssen Sie möglicherweise den Registrierungsschlüssel BackConnectionHostNames auffüllen 

  1. Suchen Sie in Regedit den folgenden Registrierungsunterschlüssel, und klicken Sie darauf: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  2. Klicken Sie mit der rechten Maustaste auf MSV1_0, zeigen Sie auf Neu, und klicken Sie dann auf Multi-String Value.
  3. Geben Sie in der Spalte Name BackConnectionHostNames ein, und drücken Sie die EINGABETASTE.
  4. Klicken Sie mit der rechten Maustaste auf BackConnectionHostNames, und klicken Sie dann auf Ändern ..... Geben Sie in das Feld Wert den CNAME-Namen oder den DNS-Alias ​​ein, der für die lokalen Freigaben auf dem Computer verwendet wird, und klicken Sie auf OK.
    • Geben Sie jeden Hostnamen in einer separaten Zeile ein.

Weitere Informationen finden Sie unter Aufruf des in IIS gehosteten WCF-Dienstes auf demselben Computer, auf dem der Client einen Authentifizierungsfehler auslöst.

0
fiat

Ich hatte das gleiche Problem, um es zu lösen, bestimmte Benutzer aus der Domäne in iis -> Aktionsleiste -> Grundeinstellungen -> Verbinden als ... -> bestimmten Benutzer

enter image description here

0
aliyan