2009-07-06 3 views
11

Ich habe eine Website, die mit einem Remote-WCF-Webdienst kommuniziert. Beide verwenden denselben benutzerdefinierten FormsAuthentication-Provider. Ich möchte mich mit dem WCF-Dienst authentifizieren, der sich als der Benutzer darstellt, der derzeit auf der Site angemeldet ist. Ich habe dies bereits manuell getan, indem ich die Benutzernamen des Benutzers verwendet habe, aber ich muss das Benutzerpasswort kennen. Also, was funktioniert so ist Furz dies: ein authentifizierter Benutzer eine Anforderung macht, ich ein Service-Client erstellen und seine Referenzen:Übergeben von FormsAuthentication-Cookie an einen WCF-Dienst

serviceClient.ClientCredentials.UserName.UserName = username; 
serviceClient.ClientCredentials.UserName.Password = password; 

Aber was ich wirklich will, ist das FormsAuthentication Cookie direkt zu übergeben, weil ich don möchte das Benutzerpasswort nicht speichern.

Irgendwelche Ideen?

+0

Hallo Ariel, wie bist du mit diesem hier zurecht gekommen? Ich kenne jemanden mit ähnlichen Problemen. –

Antwort

13

Es klingt, als ob Sie nach dem Windows Communication Foundation Authentication Service suchen.

EDIT:

Nach dem erneuten Lesen der Frage genauer (und nach Ariel Kommentar) Ich mag würde den obigen Vorschlag zurückzuziehen. Der WCF-Authentifizierungsdienst wird diesem Szenario nicht viel hinzufügen.

Ich habe dies zwischen WCF und ASP.NET nicht getan, jedoch habe ich ASP.NET-Anwendungen für die Freigabe Formulare authentifizierte Benutzer konfiguriert, vielleicht kann ich in irgendeiner Weise helfen.

Um sicherzustellen, dass beide Anwendungen das Formularauthentifizierungs-Cookie auf die gleiche Weise verschlüsseln/entschlüsseln können, sollten Sie configure the <machineKey> element für beide Anwendungen (in web.config oder machine.config abhängig davon, ob Sie dies auf der Maschinen- oder Anwendungsebene durchführen möchten)). Sie sollten sich die Attribute validation, validationKey, decryption und decryptionKey ansehen.

Stellen Sie sicher, dass Ihre <forms> Elemente in beiden web.config-Dateien ähnlich konfiguriert sind. Insbesondere die Attribute name, path und domain.

Es ist wahrscheinlich, dass dies nur für Cookies gilt für/von einem Web-Browser übergeben (kann aber auch in diesem Fall nützlich sein): So erlauben Sie Cookies zwischen den Websites weitergegeben werden www.foo.com und bar.foo .com Sie das forms Element konfigurieren würde wie folgt Cookies zulassen auf der einen Seite und erfolgreich bestanden auf den anderen gesetzt werden:

<forms ... domain=".foo.com" ... /> 

Passing das Cookie an den WCF-Dienst ist wahrscheinlich der schwierige Bit sein. Ich bin nicht sehr mit WCF erfahren, so I've adapted code from kennyw.com:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>"); 

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 
    serviceClient.MethodName(); 
} 

Wenn Sie WCF innerhalb IIS hosten (und nicht selbst Hosting) können Sie die WCF-Anforderung über die ASP.NET-Verarbeitungs-Pipeline passieren kann

durch Einstellen
<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... /> 
</system.serviceModel> 

Wenn Sie selbst sind Hosting Sie den Request-Header untersuchen konnten die eingehende Nachricht der Eigenschaften in OperationContext.Current.IncomingMessageProperties und erhalten Sie die Formularauthentifizierung Cookie-Wert und entschlüsseln sie mit FormsAuthentication.Decrypt(string) verwenden.

Ich habe keine Ahnung, ob das funktionieren würde, aber würde gerne hören, wenn es das tut!

+0

Ich sehe nicht, wie der Authentifizierungsdienst helfen könnte. Mein Szenario ist dies: USER -> Website A -> WCF Service B gehostet an anderer Stelle Benutzer meldet sich an A, A ruft B mit den Benutzeranmeldeinformationen an. Wo würden Sie den Authentifizierungsdienst hinzufügen? –

+0

Hallo Ariel. Entschuldigung, ich habe versucht, zu schnell zu antworten, ohne deine Frage wirklich gelesen zu haben. Ich werde es mit einem Update bearbeiten. – dariom

+0

Danke für den Vorschlag, ich werde das versuchen und die Ergebnisse hier teilen. –

4

Es ist einfach genug zu tun, wenn Sie den WCF-Dienst innerhalb der authentifizierten IIS-Site hosten.

Kompatibilität Aktivieren Sie den folgenden Code zu Ihrem System.ServiceModel Abschnitt in web.config

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

Dann jeden Dienst dekorieren Sie wollen das Cookie mit dem folgenden

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Jetzt akzeptieren die durch Hinzufügen Das HttpContext.Current.User.Identity-Objekt wird korrekt ausgefüllt und Sie können PrinciplePermission-Anforderungen auch verwenden, um den Zugriff nach Rolle oder bestimmten Benutzern zu beschränken.

+0

Nun, das ist das Problem, ich kann nicht den gleichen IIS verwenden. Eine Voraussetzung für das System, das ich erstelle, war, die Website und den Dienst auf separaten Rechnern zu hosten. Ich erwäge, ein freigegebenes Token zu verwenden, aber ich war mit Forms die einfachste Lösung, die von ASP.net kam. –

+0

Ah Gras! Kannst du sie wenigstens auf den gleichen Domainnamen setzen? Wenn dies der Fall ist, können Sie den Gültigkeitsbereich für den Formularauthentifizierungs-Cookie festlegen und ihn auf diese Weise freigeben. – blowdart

+0

Ich denke, die Anwendung wird in einem Intranet unter einer einzigen Stammdomäne gehostet. Wir können auch identische Maschinenschlüssel festlegen, aber bedenken Sie, dass der Benutzer auf die Website zugreift und dass die Website die WCF als Datenquelle verwendet, die den Benutzer darstellt. Es funktioniert gut mit Windows-Authentifizierung, aber die Übergabe des FormsAuthentication-Cookie ist eine andere Geschichte. Ich werde versuchen, Dariom Vorschlag (oder andere, falls verfügbar). –

Verwandte Themen