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).

¿Fue útil?

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":

Entonces, necesita saber de dónde provienen los conjuntos de reclamos:

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:

  1. El cliente crea un SecurityToken utilizando un SecurityTokenProvider
  2. El cliente serializa el SecurityToken usando un SecurityTokenSerializer
  3. El servidor deserializa el SecurityToken usando un SecurityTokenSerializer
  4. El servidor crea IAuthorizationPolicy s utilizando un SecurityTokenAuthenticator
  5. El servidor crea AuthorizationContext a partir de IAuthorizationPolicy s
  6. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top