Wie System.IdentityModel in eigener Client-Server-Anwendung verwenden,
-
22-07-2019 - |
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.)
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: Beispiel: Für Das funktioniert ganz gut. Das einzige, was ich bisher über weggelassen ist die Token-Serialisierung. Es gibt eine Serialisierung
SecurityToken
mit einem SecurityTokenProvider
SecurityToken
mit einem SecurityTokenSerializer
SecurityToken
mit einem SecurityTokenSerializer
IAuthorizationPolicy
s mit einem SecurityTokenAuthenticator
AuthorizationContext
von IAuthorizationPolicy
s // 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);
X509SecurityToken
s verwenden, um eine X509SecurityTokenProvider
/ Authenticator
. Für WindowsSecurityToken
s gibt es ein WindowsSecurityTokenAuthenticator
aber keinen Anbieter; Verwenden Sie stattdessen die WindowsSecurityToken
Konstruktor: var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
SecurityTokenSerializer
Klasse, die eine Implementierung im .NET Framework hat. Die WSSecurityTokenSerializer
Klasse, die mit WCF kommt UserNameSecurityToken
s und X509SecurityToken
s wirken wie ein Zauber (hat Deserialisierung nicht versucht), aber WindowsSecurityToken
s 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.