Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
En este tema se muestra cómo crear un autenticador de tokens de seguridad personalizado y cómo integrarlo con un administrador de tokens de seguridad personalizado. Un autenticador de tokens de seguridad valida el contenido de un token de seguridad proporcionado con un mensaje entrante. Si la validación se realiza correctamente, el autenticador devuelve una colección de IAuthorizationPolicy instancias que, cuando se evalúan, devuelve un conjunto de declaraciones.
Para usar un autenticador de tokens de seguridad personalizado en Windows Communication Foundation (WCF), primero debe crear credenciales personalizadas e implementaciones del administrador de tokens de seguridad. Para obtener más información sobre cómo crear credenciales personalizadas y un administrador de tokens de seguridad, consulte Tutorial: Creación de credenciales de servicio y cliente personalizadas.
Procedimientos
Para crear un autenticador de tokens de seguridad personalizado
Defina una nueva clase derivada de la SecurityTokenAuthenticator clase .
Invalide el CanValidateTokenCore método . El método devuelve
trueofalsedependiendo de si el autenticador personalizado puede validar o no el tipo de token entrante.Invalide el ValidateTokenCore método . Este método debe validar adecuadamente el contenido del token. Si el token pasa el paso de validación, devuelve una colección de IAuthorizationPolicy instancias. En el ejemplo siguiente se usa una implementación de directiva de autorización personalizada que se creará en el procedimiento siguiente.
internal class MySecurityTokenAuthenticator : SecurityTokenAuthenticator { protected override bool CanValidateTokenCore(SecurityToken token) { // Check that the incoming token is a username token type that // can be validated by this implementation. return (token is UserNameSecurityToken); } protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateTokenCore(SecurityToken token) { UserNameSecurityToken userNameToken = token as UserNameSecurityToken; // Validate the information contained in the username token. For demonstration // purposes, this code just checks that the user name matches the password. if (userNameToken.UserName != userNameToken.Password) { throw new SecurityTokenValidationException("Invalid user name or password"); } // Create just one Claim instance for the username token - the name of the user. DefaultClaimSet userNameClaimSet = new DefaultClaimSet( ClaimSet.System, new Claim(ClaimTypes.Name, userNameToken.UserName, Rights.PossessProperty)); List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1); policies.Add(new MyAuthorizationPolicy(userNameClaimSet)); return policies.AsReadOnly(); } }Friend Class MySecurityTokenAuthenticator Inherits SecurityTokenAuthenticator Protected Overrides Function CanValidateTokenCore(ByVal token As SecurityToken) As Boolean ' Check that the incoming token is a username token type that ' can be validated by this implementation. Return (TypeOf token Is UserNameSecurityToken) End Function Protected Overrides Function ValidateTokenCore(ByVal token As SecurityToken) As ReadOnlyCollection(Of IAuthorizationPolicy) Dim userNameToken = TryCast(token, UserNameSecurityToken) ' Validate the information contained in the username token. For demonstration ' purposes, this code just checks that the user name matches the password. If userNameToken.UserName <> userNameToken.Password Then Throw New SecurityTokenValidationException("Invalid user name or password") End If ' Create just one Claim instance for the username token - the name of the user. Dim userNameClaimSet As New DefaultClaimSet(ClaimSet.System, _ New Claim(ClaimTypes.Name, _ userNameToken.UserName, _ Rights.PossessProperty)) Dim policies As New List(Of IAuthorizationPolicy)(1) policies.Add(New MyAuthorizationPolicy(userNameClaimSet)) Return policies.AsReadOnly() End Function End Class
El código anterior devuelve una colección de directivas de autorización en el CanValidateToken(SecurityToken) método . WCF no proporciona una implementación pública de esta interfaz. En el procedimiento siguiente se muestra cómo hacerlo para sus propios requisitos.
Para crear una directiva de autorización personalizada
Defina una nueva clase que implemente la IAuthorizationPolicy interfaz.
Implemente la Id propiedad de solo lectura. Una manera de implementar esta propiedad es generar un identificador único global (GUID) en el constructor de clase y devolverlo cada vez que se solicita el valor de esta propiedad.
Implemente la Issuer propiedad de solo lectura. Esta propiedad debe devolver un emisor de los conjuntos de derechos que se derivan del token. Este emisor debe corresponder al emisor del token o a una autoridad responsable de validar el contenido del token. En el ejemplo siguiente se utiliza la declaración del emisor que se pasó a esta clase desde el autenticador de tokens de seguridad personalizado creado en el procedimiento anterior. El autenticador de tokens de seguridad personalizado usa el conjunto de declaraciones proporcionado por el sistema (devuelto por la System propiedad) para representar el emisor del token de nombre de usuario.
Implemente el método Evaluate. Este método rellena una instancia de la clase EvaluationContext (que se recibe como argumento) con afirmaciones basadas en el contenido del token de seguridad entrante. El método devuelve
truecuando ha finalizado la evaluación. En los casos en los que la implementación se basa en la presencia de otras directivas de autorización que proporcionan información adicional al contexto de evaluación, este método puede devolverfalsesi la información necesaria aún no está presente en el contexto de evaluación. En ese caso, WCF volverá a llamar al método después de evaluar todas las demás directivas de autorización generadas para el mensaje entrante si al menos una de esas directivas de autorización modificó el contexto de evaluación.internal class MyAuthorizationPolicy : IAuthorizationPolicy { string id; ClaimSet tokenClaims; ClaimSet issuer; public MyAuthorizationPolicy(ClaimSet tokenClaims) { if (tokenClaims == null) { throw new ArgumentNullException("tokenClaims"); } this.issuer = tokenClaims.Issuer; this.tokenClaims = tokenClaims; this.id = Guid.NewGuid().ToString(); } public ClaimSet Issuer { get { return issuer; } } public string Id { get { return id; } } public bool Evaluate(EvaluationContext evaluationContext, ref object state) { // Add the token claim set to the evaluation context. evaluationContext.AddClaimSet(this, tokenClaims); // Return true if the policy evaluation is finished. return true; } }Friend Class MyAuthorizationPolicy Implements IAuthorizationPolicy Private _id As String Private _tokenClaims As ClaimSet Private _issuer As ClaimSet Public Sub New(ByVal tokenClaims As ClaimSet) If _tokenClaims Is Nothing Then Throw New ArgumentNullException("tokenClaims") End If Me._issuer = tokenClaims.Issuer Me._tokenClaims = tokenClaims Me._id = Guid.NewGuid().ToString() End Sub Public ReadOnly Property Issuer() As ClaimSet Implements IAuthorizationPolicy.Issuer Get Return _issuer End Get End Property Public ReadOnly Property Id() As String Implements System.IdentityModel.Policy.IAuthorizationComponent.Id Get Return _id End Get End Property Public Function Evaluate(ByVal evaluationContext As EvaluationContext, _ ByRef state As Object) As Boolean Implements IAuthorizationPolicy.Evaluate ' Add the token claim set to the evaluation context. evaluationContext.AddClaimSet(Me, _tokenClaims) ' Return true if the policy evaluation is finished. Return True End Function End Class
Tutorial: Crear credenciales de servicio y cliente personalizadas describe cómo crear credenciales personalizadas y un administrador de tokens de seguridad personalizados. Para usar el autenticador de tokens de seguridad personalizado creado aquí, se modifica una implementación del administrador de tokens de seguridad para devolver el autenticador personalizado del CreateSecurityTokenAuthenticator método . El método devuelve un autenticador cuando se pasa un requisito de token de seguridad adecuado.
Para integrar un autenticador de tokens de seguridad personalizado con un administrador de tokens de seguridad personalizado
Sobrescriba el método CreateSecurityTokenAuthenticator en su implementación del administrador de tokens de seguridad personalizado.
Agregue lógica al método para permitir que devuelva su autenticador de token de seguridad personalizado en función del parámetro SecurityTokenRequirement. En el ejemplo siguiente se devuelve un autenticador de token de seguridad personalizado si el tipo de token de los requisitos del token es un nombre de usuario (representado por la propiedad UserName) y la dirección del mensaje para el cual se solicita el autenticador de token de seguridad es de entrada (representado por el campo Input).
internal class MyServiceCredentialsSecurityTokenManager : ServiceCredentialsSecurityTokenManager { ServiceCredentials credentials; public MyServiceCredentialsSecurityTokenManager(ServiceCredentials credentials) : base(credentials) { this.credentials = credentials; } public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator (SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver) { // Return your implementation of the SecurityTokenProvider based on the // tokenRequirement argument. SecurityTokenAuthenticator result; if (tokenRequirement.TokenType == SecurityTokenTypes.UserName) { MessageDirection direction = tokenRequirement.GetProperty<MessageDirection> (ServiceModelSecurityTokenRequirement.MessageDirectionProperty); if (direction == MessageDirection.Input) { outOfBandTokenResolver = null; result = new MySecurityTokenAuthenticator(); } else { result = base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } } else { result = base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } return result; } }Friend Class MyServiceCredentialsSecurityTokenManager Inherits ServiceCredentialsSecurityTokenManager Private credentials As ServiceCredentials Public Sub New(ByVal credentials As ServiceCredentials) MyBase.New(credentials) Me.credentials = credentials End Sub Public Overrides Function CreateSecurityTokenAuthenticator(ByVal tokenRequirement As SecurityTokenRequirement, _ <System.Runtime.InteropServices.Out()> _ ByRef outOfBandTokenResolver _ As SecurityTokenResolver) As SecurityTokenAuthenticator ' Return your implementation of the SecurityTokenProvider based on the ' tokenRequirement argument. Dim result As SecurityTokenAuthenticator If tokenRequirement.TokenType = SecurityTokenTypes.UserName Then Dim direction = tokenRequirement.GetProperty(Of MessageDirection)(ServiceModelSecurityTokenRequirement.MessageDirectionProperty) If direction = MessageDirection.Input Then outOfBandTokenResolver = Nothing result = New MySecurityTokenAuthenticator() Else result = MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, _ outOfBandTokenResolver) End If Else result = MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, _ outOfBandTokenResolver) End If Return result End Function End Class