Ich habe einen WCF-Dienst erstellt und auf dem Server bereitgestellt. Wenn ich diesen Dienst durchsuche, erhalte ich eine positive Antwort mit der URL? Wsdl. Jetzt versuche ich, den Dienst über den WCF-Testclient zu testen. Es werden die richtigen Metadaten angezeigt. Wenn ich jedoch versuche, eine der Methoden aus dem Dienst aufzurufen, wird eine Ausnahme angezeigt. Hier sind die Fehlerdetails mit Stack-Trace.
Die HTTP-Anforderung ist mit dem Clientauthentifizierungsschema 'Anonym' nicht autorisiert. Der vom Server empfangene Authentifizierungsheader war "Negotiate, NTLM".
Server-Stack-Trace:
at
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest-Anforderung, HttpWebResponse-Antwort, WebException responseException, HttpChannelFactory-Factory)
Die HTTP-Anforderung ist mit dem Clientauthentifizierungsschema 'Anonym' nicht autorisiert. Der vom Server empfangene Authentifizierungsheader war "Negotiate, NTLM".
Server-Stack-Trace:
at
System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest-Anforderung, HttpWebResponse-Antwort, WebException-AntwortException, HttpChannelFactory-Factory)
Kundenbindungen:
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
Serverbindungen:
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />
</security>
</binding>
<binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
Kundenbereich des Kunden:
<client>
<endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService"
contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" />
</client>
Abschnitt "Serverdienste":
<services>
<service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior"
name="GeoService.Saveology.com.CityStateServiceProvider">
<endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService"
contract="SEO.Common.ServiceContract.ICityStateService" />
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior"
name="GeoService.Saveology.com.ServiceMagicServiceProvider">
<endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding"
contract="SEO.Common.ServiceContract.IServiceMagicService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
</service>
</services>
Antworten:
Ich hatte keine Kontrolle über die Sicherheitskonfiguration für den Dienst, den ich anrief, bekam aber den gleichen Fehler. Ich konnte meinen Client wie folgt reparieren.
Richten Sie in der Konfiguration den Sicherheitsmodus ein:
<security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security>
Stellen Sie im Code die Proxy-Klasse so ein, dass ein Identitätswechsel möglich ist (ich habe einen Verweis auf einen Dienst namens "Kunde" hinzugefügt):
Customer_PortClient proxy = new Customer_PortClient(); proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
quelle
<security mode="TransportCredentialOnly">
scheint es, dass Sie keine Konfiguration für die Nachrichtensicherheit einschließen müssen. Die SOAP-Nachricht wird unverschlüsselt im Klartext gesendet. Das<message>
Tag scheint ignoriert zu werden, damit es keinen Schaden anrichtet, es wird einfach nicht benötigt. Quelle: msdn.microsoft.com/en-us/library/ff648505.aspxIch habe ein ähnliches Problem, haben Sie versucht:
proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
quelle
Eine andere mögliche Lösung für diesen Fehler, den ich gefunden habe. Möglicherweise haben Sie die genaue Frage von OP nicht beantwortet, können aber anderen helfen, die über diese Fehlermeldung stolpern.
Ich habe meinen Client mit WebHttpBinding im Code erstellt, um die folgende Zeile zu replizieren:
<security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" proxyCredentialType="Windows" /> </security>
Ich musste es tun:
var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows;
sowie Einstellung
proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
quelle
Ich sehe, dass dies noch nicht beantwortet wurde, dies ist ein genaues Zitat von hier :
Ich fand dies über: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html
Nach dem Googeln: http://www.google.tt/#hl=de&source=hp&q=+The+HTTP+request+ist+unauthorized+with+client+authentication+scheme+%27Anonymous
quelle
Ich hatte ein ähnliches Problem und versuchte alles, was oben vorgeschlagen wurde. Dann habe ich versucht, den clientCreditialType in Basic zu ändern, und alles hat gut funktioniert.
<basicHttpBinding> <binding name="BINDINGNAMEGOESHERE" > <security mode="TransportCredentialOnly"> <transport clientCredentialType="Basic"></transport> </security> </binding> </basicHttpBinding>
quelle
Hier ist, was ich tun musste, um dies zum Laufen zu bringen. Das heisst:
Meine Website wird über DotNetPanel verwaltet. Es gibt 3 Sicherheitsoptionen für virtuelle Verzeichnisse:
Es wird nur "Anonymen Zugriff zulassen" benötigt (obwohl dies allein nicht ausreichte).
Rahmen
proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
Hat in meinem Fall keinen Unterschied gemacht.
Die Verwendung dieser Bindung funktionierte jedoch:
<security mode="TransportWithMessageCredential"> <transport clientCredentialType="Windows" /> <message clientCredentialType="UserName" /> </security>
quelle
Versuchen Sie, Ihrem Kunden einen Benutzernamen und ein Passwort wie unten anzugeben
client.ClientCredentials.UserName.UserName = @ "Domain \ username"; client.ClientCredentials.UserName.Password = "password";
quelle
Ich hatte heute den gleichen Fehler, nachdem ich unseren Dienst bereitgestellt hatte, der einen externen Dienst in der Staging-Umgebung in Azure aufrief. Lokal rief der Dienst den externen Dienst ohne Fehler auf, nach der Bereitstellung jedoch nicht.
Am Ende stellte sich heraus, dass der externe Dienst eine IP-Validierung hat. Die neue Umgebung in Azure verfügt über eine andere IP-Adresse und wurde abgelehnt.
Wenn Sie also jemals diesen Fehler erhalten, rufen Sie externe Dienste auf
Dies kann eine IP-Einschränkung sein.
quelle
Ich habe dieses Problem gerade auf einer Entwicklungsmaschine (die Produktion funktioniert einwandfrei). Ich ändere meine Konfiguration in IIS, um anonymen Zugriff zu ermöglichen, und gebe meinen Namen und mein Passwort als Anmeldeinformationen ein.
Ich bin mir nicht sicher, aber es funktioniert zu Testzwecken.
quelle
Ich hatte auch diesen Fehler und schließlich funktionierten diese Codes für mich in Dot Net Core 3.1
Installieren Sie zuerst svcutil in der Eingabeaufforderung: dotnet tool install --global dotnet-svcutil
Dann schließen Eingabeaufforderung , und öffnen Sie es erneut.
Erstellen Sie dann die Referenz.cs in der Eingabeaufforderung:
dotnet-svcutil http://YourService.com/SayHello.svc
(Es benötigt eine Eingabetaste sowie Benutzername und Passwort)
Fügen Sie dem Projektstamm einen Ordner mit dem Namen Connected Services hinzu .
Kopieren Sie die Datei Reference.cs in den Ordner Connected Services.
Fügen Sie diese 4 Zeilen zu Reference.cs hinzu, nachdem Sie BasicHttpBinding erstellt und MaxBufferSize festgelegt haben:
result.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; result.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; result.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; result.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
Verwenden Sie diesen Dienst in Ihrem Controller:
public async Task<string> Get() { try { var client = new EstelamClient(); client.ClientCredentials.UserName.UserName = "YourUserName"; client.ClientCredentials.UserName.Password = "YourPassword"; var res = await client.EmployeeCheckAsync("service parameters"); return res.ToString(); } catch (Exception ex) { return ex.Message + " ************ stack : " + ex.StackTrace; } }
Vergessen Sie nicht, diese Pakete in .cshtml zu installieren:
<PackageReference Include="System.ServiceModel.Duplex" Version="4.6.*" /> <PackageReference Include="System.ServiceModel.Http" Version="4.6.*" /> <PackageReference Include="System.ServiceModel.NetTcp" Version="4.6.*" /> <PackageReference Include="System.ServiceModel.Security" Version="4.6.*" />
quelle