2009-06-04 11 views
25

Ich habe einen WCF-Dienst, der BasicHttpBinding mit Windows-Authentifizierung verwendet. Die meisten Clients sind Domänenkonten und stellen mithilfe ihrer Standardanmeldeinformationen eine Verbindung zum Dienst her.So geben Sie Windows-Anmeldeinformationen in der WCF-Clientkonfigurationsdatei an

Jetzt möchte ich eine Verbindung zu dem Dienst von einem ASP.NET-Client herstellen, der unter einem lokalen Konto ausgeführt wird. Ich möchte mithilfe von Windows-Anmeldeinformationen (Domäne \ Benutzer und Kennwort), die für die ASP.NET-Anwendung verfügbar sind, eine Verbindung mit dem WCF-Dienst herstellen.

Ich weiß, ich kann dies in Code mit ClientBase < T> .ClientCredentials.

Gibt es eine Möglichkeit, die Anmeldeinformationen (Domäne \ Benutzer und Kennwort) in der Datei web.config des Clients anzugeben, damit ich den Code nicht ändern muss?

EDIT

Wenn es nicht in der Konfigurationsdatei durchgeführt werden kann, ist es eine Möglichkeit, von System.Net.ICredentials oder System.Net.NetworkCredential als Berechtigungsnachweis für einen WCF-Dienst? Das .NET Framework stellt diese als eine homogene Möglichkeit zur Bereitstellung von Netzwerkanmeldeinformationen bereit. Mit WCF scheint dies jedoch zugunsten eines neuen inkompatiblen Systems auf der Grundlage der nicht verwandten System.ServiceModel.Description.ClientCredentials-Klasse hinausgeworfen worden zu sein.

EDIT 2

auf die ursprüngliche Frage Marcs Antwort annehmen - es scheint, gibt es keine Möglichkeit, dies in der Client-Konfigurationsdatei zu tun ist :(

Ich sehe dies in WCF als Mangel würde - Ich akzeptiere nicht, dass Microsoft uns absichtlich davon abhalten sollte, Anmeldeinformationen in die Konfigurationsdatei zu schreiben - schließlich müssen sie irgendwo gespeichert werden, und das Framework enthält Möglichkeiten zum Verschlüsseln der Konfigurationsdatei Ich könnte ein benutzerdefiniertes BehaviorExtensionElement dafür erstellen , aber es sollte out of the box verfügbar sein.

Es ist auch ein bisschen inkonsistent: das Konfigurationselement system.net/mailSettings/smtp/network ermöglicht die Angabe von Anmeldeinformationen, also warum nicht WCF?

Bezüglich der zweiten Frage über System.Net.NetworkCredential Verwendung, wie es scheint von this blog dass es möglich ist, zumindest wenn die Windows-Authentifizierung verwenden, mit dem folgenden Code:

factory.Credentials.Windows.ClientCredential = 
    new System.Net.NetworkCredential(name, password, domain); 

Antwort

11

Sie können nicht geben Sie Ihre Anmeldeinformationen in der Config-Datei, leider - Sie müssen dies in Code tun (am wahrscheinlichsten, weil sonst am Ende Sie mit Anmeldeinformationen in Ihrer Konfigurationsdatei, im Klartext - keine gute Sache ....).

+3

„... in Ihrer Konfigurationsdatei, im Klartext“ ist nicht generell eine gute Sache, aber in der Konfigurationsdatei verschlüsselt ist OK. – Joe

+0

@marc_s Ist es immer noch nicht möglich über die Konfigurationsdatei zu setzen? –

+1

@Johnny_D: Nein, nicht so weit ich weiß. –

0

Haben Sie das versucht?

<system.web> 
     <identity impersonate="true" userName="username" password="password"/> 
</system.web> 
+2

Nein, das hilft nicht wirklich - der ASP.NET-Server ist für die Delegierung nicht vertrauenswürdig. – Joe

4

Ich verstehe, dass es keinen Mechanismus ist die Anmeldeinformationen innerhalb der <Bindung> Tags zu spezifizieren, aber warum dies nicht tun:

Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 
+1

das würde funktionieren - aber ich würde dringend empfehlen, Ihre Konfigurationsdatei in diesem Fall zu verschlüsseln! –

+0

Ja Ich weiß, dass ich es im Code machen kann, ich möchte vermeiden, den Code zu ändern. – Joe

+0

Joe - In meinem Beispiel können Sie Ihren Benutzernamen und Ihr Passwort in der Datei app/web.config angeben, da Sie dies nicht nativ tun können. – Lewis

18
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 

falsch ist.Es wird mit Nachrichtensicherheit und verwendet clientCredentialType = "UserName". Sie sollten

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...); 
+0

Ich habe nicht Ihren kompletten Beitrag. Du hast die Antwort schon verstanden - sorry. – Steven

+0

Obwohl dies eine sehr alte Frage ist, poste ich dies für jeden mit dem gleichen Problem. – Steven

+7

Du hast auch nicht deinen kompletten Satz;) – Gagege

1
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials; 
5

Es scheint, verwenden gibt es keine Möglichkeit ID und das Kennwort in der Standard-Bindungskonfiguration einstellen (Ich bin noch auf der Suche), ich habe es den Code unten hinzufügen, aber ich wünschte, noch Microsoft würde fügen sie die Standardbindungen

<appSettings> 
    <add key="user" value="user" /> 
    <add key="password" value="password" /> 
    <add key="domain" value="domain" /> 
    </appSettings> 


    // client side code 
    string userName = ConfigurationManager.AppSettings.Get("user"); 
    string pswd = ConfigurationManager.AppSettings.Get("password"); 
    string domain = ConfigurationManager.AppSettings.Get("domain"); 

    client.ClientCredentials.Windows.ClientCredential.Domain = domain; 
    client.ClientCredentials.Windows.ClientCredential.UserName = userName; 
    client.ClientCredentials.Windows.ClientCredential.Password = pswd; 

Sebastian Castaldi

Verwandte Themen