Frage

Ich habe eine einfache Client-Server-Anwendung auf TcpClient / TcpListener und SslStream basierend bekommt. Die Kunden können sich auf dem Server authentifizieren unter Verwendung eines X509Certificate oder durch einen Benutzernamen und ein Passwort zu senden, nachdem die SslStream hergestellt wurde.

WCF nutzt die System.IdentityModel Namespace zur Authentifizierung, aber offensichtlich, dass in beliebigen Anwendungen verwendet werden kann - was interessant klingt. Informationen darüber, wie dies zu tun ist spärlich, obwohl (oder mein Google foo ist schwach heute).

Also, meine Frage ist: Was muss ich tun System.IdentityModel mit meiner Anwendung zu integrieren Ich bin mir nicht sicher, ob ich das alles ClaimSet Sachen brauchen, aber es wäre schön, wenn? Benutzer können ihr Windows-Konto oder andere zur Verfügung gestellt Authentifizierungsmechanismus bei der Verwendung nur melden Sie. (Leider kann ich nicht nur auf WCF wechseln, aber das benutzerdefinierte Protokoll verwenden müssen, obwohl ich einige Änderungen vornehmen kann, falls erforderlich.)

War es hilfreich?

Lösung

Ihre Google foo waren in der Tat schwach. Die Antwort ist direkt hinter dem Link in meiner Frage. Also hier sind ein paar Links href="http://leastprivilege.com/category/identitymodel/" rel="noreferrer"> diesem Blog falls jemand an

Als erstes sollten Sie versuchen, zu verstehen, "das Set Sachen behaupten":

Dann müssen Sie wissen, wo Anspruch Sätze kommen aus:

Mit diesem Wissen wird es eigentlich ganz einfach.

Wenn ich es richtig verstehen, würde der grundlegende Arbeitsablauf so etwas wie diese:

  1. Client erstellt eine SecurityToken mit einem SecurityTokenProvider
  2. Client serialisiert die SecurityToken mit einem SecurityTokenSerializer
  3. Server deserialisiert die SecurityToken mit einem SecurityTokenSerializer
  4. Server erstellt IAuthorizationPolicys mit einem SecurityTokenAuthenticator
  5. Server erstellt AuthorizationContext von IAuthorizationPolicys
  6. Fertig

Beispiel:

// Create the SecurityTokenProvider
var p = new UserNameSecurityTokenProvider("username", "password");

// Get the SecurityToken from the SecurityTokenProvider
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken;

// ... transmit SecurityToken to server ...

// Create the SecurityTokenAuthenticator
var a = new CustomUserNameSecurityTokenAuthenticator(
    UserNamePasswordValidator.None);

// Create IAuthorizationPolicies from SecurityToken
var i = a.ValidateToken(t);

// Create AuthorizationContext from IAuthorizationPolicies
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i);
ShowClaims(c.ClaimSets);

Für X509SecurityTokens verwenden, um eine X509SecurityTokenProvider / Authenticator. Für WindowsSecurityTokens gibt es ein WindowsSecurityTokenAuthenticator aber keinen Anbieter; Verwenden Sie stattdessen die WindowsSecurityToken Konstruktor:

var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());

Das funktioniert ganz gut. Das einzige, was ich bisher über weggelassen ist die Token-Serialisierung. Es gibt eine SecurityTokenSerializer Klasse, die eine Implementierung im .NET Framework hat. Die WSSecurityTokenSerializer Klasse, die mit WCF kommt

Serialisierung UserNameSecurityTokens und X509SecurityTokens wirken wie ein Zauber (hat Deserialisierung nicht versucht), aber WindowsSecurityTokens sind offenbar nicht von dem Serializer unterstützt. Dies läßt mich mit den beiden Authentifizierungsmethoden, die ich habe bereits (Zertifikate und Benutzername / Passwort) und, wie ich nicht, dass AuthorizationContext wollte sowieso, ich werde mit dem, was ich habe:)

Andere Tipps

Ich habe nicht den Ruf einen Kommentar zu der bestehenden Lösung zu schreiben, aber ich mag die neuen URLs zu den Blogs in der Lösung enthalten sind zu veröffentlichen, da diese nicht mehr funktionieren. Wenn jemand dies auf einen Kommentar ändern, würde ich sehr dankbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top