WCF WebHttp Gemischte Authentifizierung (Basic AND Anonymous)

8

All dies bezieht sich auf die WebHttp-Bindung, die in einem benutzerdefinierten Service-Host gehostet wird (IIS ist zu diesem Zeitpunkt keine Option).

Ich habe einen benutzerdefinierten UserNamePasswordValidator und eine benutzerdefinierte IAuthorizationPolicy implementiert. Wenn ich die Bindung des Endpunkts für die Verwendung der Standardauthentifizierung konfiguriere, funktioniert alles so, wie ich möchte (benutzerdefinierter Prinzipal, benutzerdefinierte Rollen usw.).

Ich möchte auch die Möglichkeit für anonymen HTTP-Zugriff hinzufügen, und meine benutzerdefinierten Implementierungen versetzen den anonymen Benutzer in einige Standardrollen usw. (wenn kein Authenticate-Header gesendet wird).

Was jetzt passiert, ist, dass anonyme Benutzer eine 401 erhalten, bevor einer meiner benutzerdefinierten Codes getroffen wird. Wenn ich die HTTP-Standardauthentifizierungsanforderung deaktiviere, wird der Authenticate-Header vollständig ignoriert.

Wie konfiguriere ich oder injiziere einen Authenticate-Header , um dies auf beide Arten zu tun (ohne zwei separate Endpunkte zu erstellen)?

    
TheSoftwareJedi 16.10.2008, 18:54
quelle

4 Antworten

1

Zunächst reagiert der Dienst gemäß der Spezifikation korrekt auf den anonymen Anruf.

>

Zweitens ist das unmöglich. Wenn Sie Ihren Dienst selbst hosten und über eine HTTP-Bindung verfügen, verwendet WCF eine System.Net.HttpListener -Instanz, um auf HTTP-Anforderungen antworten zu können (erstellt in System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen ). Dieser Listener verfügt über eine Methode namens HandleAuthentication , die so lange aufgerufen wird, bis einer Ihrer benutzerdefinierten Codes aufgerufen wird. Es ist verantwortlich für die Rücksendung der 401-Antwort mit der Herausforderung (WWW-Authenticate). Sie können nichts dagegen tun. Wenn ja, würde ich gerne wissen.

Sie haben also die folgenden Optionen:

  • zwei Endpunkte
  • Konfigurieren Sie Ihre Clients so, dass sie die Standardanmeldeinformationen kennen
  • Ändern Sie Ihre Kunden, damit sie auf die Herausforderung reagieren können
Ronald Wildenberg 24.10.2008, 16:57
quelle
0

Ich habe in der Vergangenheit darüber geforscht und festgestellt, dass dies nicht über die Konfiguration möglich ist, es sei denn, Sie erstellen zwei separate Endpunkte (was nicht Ihren Vorstellungen entspricht). Es wird einfach nicht von WCF out of the box unterstützt.

Allerdings ist WCF extrem anpassbar und Sie könnten dies wahrscheinlich tun, indem Sie einen benutzerdefinierten Kanal / eine benutzerdefinierte Bindung schreiben, die das macht, was Sie wollen. Ich empfehle Ihnen, sich den REST-Schach -Quellcode anzusehen. Es sollte dich beginnen.

    
JarrettV 18.10.2008 04:04
quelle
0

Am besten implementieren Sie eine Standardrolle über einen Rollenanbieter und lassen Sie anonyme Benutzer automatisch dieser Rolle beitreten. Setzen Sie dann entweder programmgesteuert oder über eine Richtlinieninjektions- (aspektorientierte) Richtlinie fest, dass bestimmte anonyme Zugriffe über die bestimmte Rolle erlaubt sind.

Wie es über die Konfiguration eingerichtet wird, wäre es, wenn es möglich wäre, ziemlich schwierig und irgendwie "hacky".

    
Adron 20.10.2008 18:53
quelle
-2

Ich glaube nicht ... Ich habe gerade geschrieben, dass Sie einen separaten Endpunkt erstellen müssen, als ich entschieden habe, Ihre Frage noch einmal zu lesen und die letzte Aussage Ihrer Frage bemerkt habe. Also wäre die Antwort nein (das weiß ich)

    
sebagomez 17.10.2008 17:32
quelle