Mi Google foo era de hecho débil. La respuesta está justo detrás del enlace en mi pregunta. Así que aquí hay un par de enlaces a this blog en caso de que alguien tenga la misma pregunta con el tiempo.
En primer lugar, usted debe tratar de entender "que dicen cosas de ajuste":
Entonces, es necesario saber de dónde proceden de conjuntos de notificaciones:
Armado con este conocimiento, lo que realmente se hace muy sencillo.
Si he entendido bien, el flujo de trabajo básico sería algo como esto:
- cliente crea un
SecurityToken
utilizando un cliente SecurityTokenProvider
- serializa el
SecurityToken
usando un servidor SecurityTokenSerializer
- deserializa el
SecurityToken
usando a SecurityTokenSerializer
- El servidor crea
IAuthorizationPolicy
s usando SecurityTokenAuthenticator
- Server crea
AuthorizationContext
de IAuthorizationPolicy
s
- Hecho
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 utilizan un X509SecurityTokenProvider
/Authenticator
. Para WindowsSecurityToken
s hay un WindowsSecurityTokenAuthenticator
pero no es un proveedor; En su lugar, utilice el WindowsSecurityToken
constructor:
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 .NET framework: la clase WSSecurityTokenSerializer
que viene con WCF.
Serialización UserNameSecurityToken
s y s X509SecurityToken
funciona de maravilla (no han tratado deserialización), pero WindowsSecurityToken
s aparentemente no son compatibles 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 :)
En caso de que alguien esté interesado, no estoy seguro de que SecurityToken deba crearse en el lado del cliente y transmitirse a un servidor. Para la seguridad X.509, tiene mucho más sentido iniciar un SslStream con el servidor y crear el X509SecurityToken a partir del certificado del servidor; para la seguridad de Windows, se puede crear WindowsSecurityToken a partir de negotiateStream.RemoteIdentity si se utiliza un NegotiateStream. Para la seguridad de nombre de usuario/contraseña, por supuesto, el nombre de usuario y la contraseña deberán transmitirse. – dtb