Cómo usar System.IdentityModel en la propia aplicación cliente-servidor
-
22-07-2019 - |
Pregunta
Tengo una aplicación simple cliente-servidor basada en TcpClient / TcpListener y SslStream. Los clientes pueden autenticarse en el servidor utilizando un X509Certificate o enviando un nombre de usuario y contraseña después de que se haya establecido el SslStream.
WCF utiliza el espacio de nombres System.IdentityModel para fines de autenticación, pero aparentemente que puede usarse en aplicaciones arbitrarias, lo que suena interesante. Sin embargo, la información sobre cómo hacer esto es escasa (o mi foo de Google es débil hoy).
Entonces, mi pregunta es: ¿Qué debo hacer para integrar System.IdentityModel con mi aplicación? No estoy seguro de si necesito todas esas cosas de ClaimSet, pero sería bueno si los usuarios pueden iniciar sesión simplemente usando su cuenta de Windows o cualquier otro mecanismo de autenticación proporcionado. (Lamentablemente, no puedo cambiar a WCF, sino que tengo que usar el protocolo personalizado, aunque puedo hacer algunos cambios si es necesario).
Solución
Mi foo de Google era realmente débil. La respuesta está justo detrás del enlace en mi pregunta. Así que aquí hay un par de enlaces a este blog en caso de que alguien tenga la misma pregunta eventualmente.
Primero, debes tratar de entender "ese conjunto de afirmaciones":
- Reclamaciones
- Conjuntos de reclamos
- Inspección de conjuntos de reclamos
- Windows y X509Certificate Claim Sets
- Operaciones típicas en conjuntos de reclamos
Entonces, necesita saber de dónde provienen los conjuntos de reclamos:
- Políticas de autorización, contexto y Transformación de reclamos
- Transformación de reclamos en WCF
- Autorización Transformación de contexto y reclamos fuera de WCF
Armado con este conocimiento, en realidad se vuelve bastante simple.
Si lo entiendo correctamente, el flujo de trabajo básico sería algo como esto:
- El cliente crea un
SecurityToken
utilizando unSecurityTokenProvider
- El cliente serializa el
SecurityToken
usando unSecurityTokenSerializer
- El servidor deserializa el
SecurityToken
usando unSecurityTokenSerializer
- El servidor crea
IAuthorizationPolicy
s utilizando unSecurityTokenAuthenticator
- El servidor crea
AuthorizationContext
a partir deIAuthorizationPolicy
s - Listo
Ejemplo:
// 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);
Para X509SecurityToken
s utilice un X509SecurityTokenProvider
/ Authenticator
. Para WindowsSecurityToken
s hay un WindowsSecurityTokenAuthenticator
pero no un proveedor; en su lugar, use el constructor WindowsSecurityToken
:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
Esto funciona bastante bien. Lo único que omití hasta ahora es la serialización de tokens. Hay una clase SecurityTokenSerializer
que tiene una implementación en el marco .NET: la clase WSSecurityTokenSerializer
que viene con WCF.
Serializar UserNameSecurityToken
sy X509SecurityToken
s funciona de maravilla (no ha intentado la deserialización), pero aparentemente WindowsSecurityToken
s no es compatible con El serializador. Esto me deja con los dos métodos de autenticación que ya tengo (certificados y nombre de usuario / contraseña) y, como no quería ese AuthorizationContext
de todos modos, me quedaré con lo que tengo:)
Otros consejos
No tengo la reputación de publicar un comentario en la solución existente, pero me gustaría publicar las nuevas URL en los blogs que figuran en la solución, ya que ya no funcionan. Si alguien puede cambiar esto a un comentario, estaría muy agradecido.
- Reclamaciones
- Sets de reclamos
- Inspección de conjuntos de reclamos
- Conjuntos de reclamos de certificados de Windows y X509
- Operaciones típicas en conjuntos de reclamos
- Políticas de autorización, contexto y transformación de reclamos
- Reclamos transformación en WCF
- Contexto de autorización y transformación de reclamaciones fuera de WCF