Wie löse ich SecurityNegotiationException und InvalidCredentialException in WCF
So, ich hab geschrieben ein kleines Spiel und wünschen für das Spiel spielbar über das internet.
Ich habe getestet das Spiel nur über localhost mit diesen configs:
Client Winapp Anwendung:
App.Config-Datei
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<client>
<endpoint name ="CommandBoard"
address="net.tcp://localhost:9000/commandboard"
binding = "netTcpBinding"
contract="CommandBoardServiceLibrary.ICommandBoardService"/>
</client>
</system.serviceModel>
</configuration>
Während in der Client Winform-Code habe ich es anschließen, wie dies
ChannelFactory<ICommandBoardService> remoteFactory= new ChannelFactory<ICommandBoardService>("CommandBoard");
ICommandBoardService proxy = remoteFactory.CreateChannel();
Nächsten, Gastgeber der service, den ich erstellen Sie eine Konsolenanwendung.
App.config ist basic. Habe nichts verändert, nur in den eigentlichen code.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
Console app-code:
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(CommandBoardServiceLibrary.CommandBoardService)))
{
host.AddServiceEndpoint(typeof(
CommandBoardServiceLibrary.ICommandBoardService),
new NetTcpBinding(),
"net.tcp://localhost:9000/commandboard");
host.Open();
Console.ReadLine();
}
}
Sowohl der client und der host gleichzeitig funktioniert perfekt auf meinem computer.
Wenn ich jetzt ändern Sie die client-App.Config
<client>
<endpoint name ="CommandBoard"
address="net.tcp://23.122.59.211:9000/commandboard"
binding = "netTcpBinding"
contract="CommandBoardServiceLibrary.ICommandBoardService"/>
</client>
und führen Sie es auf einem anderen computer in einem anderen Netzwerk bekomme ich die folgende Fehlermeldung:
System.ServiceModel.Security.SecurityNegotiationException: The server has rejected the client credentials. ---> System.Security.Authentication.InvalidCredentialException: The server has rejected the client credentials. ---> System.ComponentModel.Win32Exception: The logon attempt failed
Wo ist die Quelle dieses Fehlers? Konfiguriert es falsch? Oder bin ich etwas fehlt?
EDIT: Web.config für den WCF-Dienst
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 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 binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
- Was ist die server-WCF-Konfiguration?
- Wie würde ich herausfinden, dass für Sie? Ich habe gerade angefangen zu lernen, WCF, also bin ich nicht allzu verwendet das layout alles. Sind Sie auf der Suche für das Web.Config-Datei in meinem CommandBoardServiceLibrary?
- Es ist der server, definiert die Anforderungen an die Sicherheit. Ja, es ist das web.in der config von dem server.
- Idk, wenn Sie bemerkt, aber ich habe es, bevor Sie kommentiert wieder.
- Sie immer noch Verstand, mir zu helfen?
- Sicher, ich kann es wieder. Ist die Antwort unten nicht für Sie arbeiten?
- Ich habe noch, es zu versuchen. Ich Las den link den er gepostet. Aber ich habe gelesen, dass standardmäßig die bindingconfiguration festgelegt ist "" also ich sehe nicht, wie das würde helfen, mein Szenario.
- Wo haben Sie
<service>
definiert, die in der server-config? - Wenn es nicht im web.config, ich denke, dass ich nie eines erstellt. Ich dachte immer, die configs wurden in den Kunden-und host-config-Dateien
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle Konfiguration von WCF erfolgt innerhalb der
<system.serviceModel>
tag. Dies gilt für host und client. Seit Ihrem host-service hat keine serviceModel tag, WCF gilt der Standard für die netTcpBinding die transport Sicherheit.Der AUFTRAGGEBER hat das service-Modell-Tags, aber keine Sicherheits-Einstellungen, so wird es versuchen die Standardeinstellung für das netTcpBinding zu.
Können Sie "WCF Service configuration editor" - tool, das im Lieferumfang von Visual Studio, um Bindung und Sicherheit für Ihre client und host, aber im Grunde genommen, müssen Sie überschreiben die Standardwerte.
Erstellen Sie eine Konfiguration für den Endpunkt auf client und server und
bindingconfiguration gleich "", so wie hier:
Hier finden Sie eine komplette Anleitung für das netTcpBinding.
Basierend auf Ihrer Konfiguration und der Tatsache, dass es tatsächlich funktioniert lokal, bedeutet, dass Sie so konfiguriert haben, dass ein Teil richtig. Allerdings sollten Sie dies für Ihre Host-Teil.
Nun eine der wichtigen Teile, die Sie brauchen, um physisch zu setzen Sie Ihre Metadaten. Ohne diesen Endpunkt konfiguriert, werden Sie haben schwere Probleme.
Nun, dass Sie so konfiguriert haben, dass Teile Ihrer Gastgeber, die Sie brauchen, um physisch installieren Sie den Dienst. Sie einfach zu veröffentlichen, zu bauen, installieren Sie die ausführbare Datei, dann überprüfen, ob der Dienst ist in der Tat, die auf Ihrem Computer durch Dienstleistungen
Dies ist der andere Teil, wo ich glaube, Sie haben ein Problem, durch das
svc utility
. Sie können nicht generieren einer gültigenURI
für Ihren Dienst. Wenn Sie so konfiguriert haben, dass die Host richtig, das wird funktionieren:URI
zu:net.tcp://localhost:8523/ServiceName
klicken Sie dann auf Go. Sollte es beheben, oder Sie können versuchen, automatisch zu beheben. Die Port-Nummer kann geändert werden müssen.Sobald Sie Ihre Referenz, es sollte so einfach wie:
Erstellen Sie die
Client
Objekt, dann setzen Sie die Methode aus dem interface. Dieser Ansatz sollte auch zu lindern, die Sicherheits-Probleme. Ich habe das Gefühl, dass da eine ungültige URI verwendet wird.Möglicherweise müssen Sie Visual Studio als Administrator auch.
Ich hoffe, das hilft.