Comment utiliser System.IdentityModel dans sa propre application client-serveur
-
22-07-2019 - |
Question
J'ai une application client-serveur simple basée sur TcpClient / TcpListener et SslStream. Les clients peuvent s’authentifier auprès du serveur à l’aide d’un certificat X509 ou en envoyant un nom d’utilisateur et un mot de passe après l’établissement de SslStream.
WCF utilise l'espace de noms System.IdentityModel à des fins d'authentification, mais apparemment pouvant être utilisé dans des applications arbitraires - ce qui semble intéressant. Les informations sur la procédure à suivre sont toutefois rares (ou mon foo Google est faible aujourd'hui).
Ma question est donc la suivante: Que dois-je faire pour intégrer System.IdentityModel à mon application? Je ne suis pas sûr d'avoir besoin de tous ces éléments de ClaimSet, mais ce serait bien si les utilisateurs peuvent se connecter simplement en utilisant leur compte Windows ou tout autre mécanisme d'authentification fourni. (Malheureusement, je ne peux pas simplement passer à WCF mais utiliser le protocole personnalisé, bien que je puisse y apporter des modifications si nécessaire.)
La solution
Mon foo Google était vraiment faible. La réponse est juste derrière le lien dans ma question. Voici donc quelques liens vers ce blog au cas où quelqu'un aurait éventuellement la même question.
Tout d’abord, vous devez essayer de comprendre "ce que sont les revendications":
- Réclamations
- Ensembles de revendications
- Inspection des ensembles de revendications
- Ensembles de revendications Windows et X509Certificate
- Opérations typiques sur les jeux de revendications
Ensuite, vous devez savoir d’où proviennent les ensembles de revendications:
- Règles d'autorisation, contexte et Transformation des revendications
- Transformation des revendications en WCF
- Autorisation Transformation du contexte et des revendications en dehors de la WCF
Armé de cette connaissance, cela devient en réalité assez simple.
Si je le comprends bien, le flux de travail de base ressemblerait à ceci:
- Le client crée un
SecurityToken
à l'aide d'unSecurityTokenProvider
- Le client sérialise le
SecurityToken
à l'aide d'unSecurityTokenSerializer
- Le serveur désérialise
SecurityToken
à l'aide d'unSecurityTokenSerializer
- Le serveur crée des
IAuthorizationPolicy
à l'aide d'unSecurityTokenAuthenticator
- Le serveur crée un
AuthorizationContext
à partir deIAuthorizationPolicy
s - terminé
Exemple:
// 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);
Pour les X509SecurityToken
, utilisez un X509SecurityTokenProvider
/ Authenticator
. Pour WindowsSecurityToken
, il existe un WindowsSecurityTokenAuthenticator
mais pas un fournisseur; utilisez plutôt le constructeur WindowsSecurityToken
:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
Cela fonctionne assez bien. La seule chose que j'ai omise jusqu'ici est la sérialisation des jetons. Il existe une classe SecurityTokenSerializer
qui a une implémentation dans le framework .NET: la classe WSSecurityTokenSerializer
fournie avec WCF.
Sérialisation des UserNameSecurityToken
et des X509SecurityToken
fonctionnent comme un charme (je n'ai pas essayé la désérialisation), mais les WindowsSecurityToken
ne sont apparemment pas pris en charge par le sérialiseur. Cela me laisse avec les deux méthodes d'authentification que j'ai déjà (certificats et nom d'utilisateur / mot de passe) et, comme je ne voulais pas que AuthorizationContext
, je m'en tiendrai à ce que j'ai:)
Autres conseils
Je n'ai pas la réputation de publier un commentaire sur la solution existante, mais j'aimerais publier les nouvelles URL sur les blogs répertoriés dans la solution, car celles-ci ne fonctionnent plus. Si quelqu'un peut changer cela en un commentaire, j'en serais très obligé.
- Réclamations
- Ensembles de revendications
- Inspection des ensembles de demandes d’indemnisation <> / a>
- ensembles de revendications de certificat Windows et X509
- Opérations typiques sur les ensembles de revendications
- Transformation des règles d'autorisation, du contexte et des revendications
- Revendications transformation dans WCF
- Contexte de l'autorisation et transformation des revendications en dehors de la WCF