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)?
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:
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.
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".
Tags und Links wcf .net authentication http http-authentication