WCF Benutzername ohne Zertifikat

Ich arbeite an einem Projekt, für das ich Folgendes benötige.

WCF-Dienst auf der Serverseite (.NET 3.5)WPF-Client für die Clientseite (.NET 3.0)

Ich habe eine vorhandene Anwendung, von der ich die Authentifizierung und Autorisierung verwenden muss (auf der Serverseite). Ich muss auch einige Metadaten über den Benutzer im Thread-Prinzipal des WCF-Dienstes (ein Site-Objekt) speichern. Ich mache das, damit ich im WCF-Dienst darauf zugreifen kann, wenn ich unbedingt muss; Für einige Geschäftslogiken ist dies möglicherweise erforderlich. Also war mein Plan, folgendes zu tun ...

Erstellen Sie einen benutzerdefinierten ServiceAuthorizationManager für den Server. Dort werde ich den Benutzer anmelden und die Rollen aus der vorhandenen Anwendung abrufen. Ich werde das "Site" -Objekt zwischenspeichern und bei weiteren Anfragen aus dem Cache ziehen. Ich benötige auch ein CustomPrincipal-Objekt, um meine benutzerdefinierten Daten zu speichern. Ich möchte die Identität des Benutzers annehmen, damit ich die in WCF integrierte Rollenfilterung wie folgt verwenden kann:

[PrincipalPermission(SecurityAction.Demand, Role = "Role1")]
public string[] RolesForUser(string username){}

Ich habe versucht, die ASP.NET-Autorisierung mit einem benutzerdefinierten Rollenanbieter zu verwenden, konnte jedoch auf dem aktuellen Prinzipal keine Einstellungen vornehmen. Ich habe auch versucht, eine benutzerdefinierte IAuthorizationPolicy zu verwenden, aber es sind Probleme aufgetreten. Diese Probleme betrafen die Möglichkeit, die Anwendung WCFClient.exe zu verwenden, wenn festgestellt wurde, dass sie (unter Verwendung des mex-Endpunkts) keine Anmeldeinformationen enthielt, sodass die Anmeldung fehlschlug. Ich habe schließlich entschieden, dass ein ServiceAuthorizationManager der richtige Weg ist, bin aber offen für andere Vorschläge.

uf dem Client sammle ich die Anmeldeinformationen und füge sie wie folgt in die WCF-Proxy-Klasse ei

proxy.ChannelFactory.Credentials.UserName.UserName = userName;
proxy.ChannelFactory.Credentials.UserName.Password = password;

Als ich anfing, diesen Weg zu gehen, bemerkte ich, dass ich den Benutzernamen / das Passwort in der CheckAccessCore-Methode meiner Manager-Klasse nicht abrufen konnte. Weitere Untersuchungen ergaben, dass ich mich wirklich in einem benutzerdefinierten UserNamePasswordValidator authentifizieren sollte. Also habe ich eine davon geschaffen. Das Problem ist, dass die validate-Methode nie aufgerufen wurde.

Weitere Untersuchungen haben ergeben, dass mein WCF-Dienst für den Aufruf der Validierungsmethode entweder über Sicherheit auf Nachrichten- oder Transportebene verfügen muss. Das Problem dabei ist, dass ich nicht herausfinden kann, wie ich eine Nachricht oder eine Sicherheit auf Transportebene ohne ein @ erhalten sol X.509 Zertifikat. Dieses Produkt wird auf mehreren hundert unglaublich gesperrten Computern installiert, und die Installation eines Zertifikats ist nicht möglich.

Gibt es eine Möglichkeit, meine Fragen zu beantworten, ohne ein Zertifikat zu installieren?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage