Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo argomento illustra come creare un autenticatore di token di sicurezza personalizzato e come integrarlo con un gestore token di sicurezza personalizzato. Un autenticatore del token di sicurezza convalida il contenuto di un token di sicurezza fornito con un messaggio in arrivo. Se la convalida ha esito positivo, l'autenticatore restituisce una raccolta di IAuthorizationPolicy istanze che, se valutate, restituisce un set di attestazioni.
Per usare un autenticatore di token di sicurezza personalizzato in Windows Communication Foundation (WCF), è prima necessario creare credenziali personalizzate e implementazioni del gestore dei token di sicurezza. Per altre informazioni sulla creazione di credenziali personalizzate e di un gestore di token di sicurezza, vedere Procedura dettagliata: Creazione di credenziali client e servizio personalizzate.
Procedures
Per creare un autenticatore di token di sicurezza personalizzato
Definire una nuova classe derivata dalla SecurityTokenAuthenticator classe .
Eseguire l'override del metodo CanValidateTokenCore. Il metodo restituisce
trueofalsea seconda che l'autenticatore personalizzato possa convalidare o meno il tipo di token in ingresso.Eseguire l'override del metodo ValidateTokenCore. Questo metodo deve convalidare il contenuto del token in modo appropriato. Se il token supera il passaggio di convalida, restituisce una raccolta di IAuthorizationPolicy istanze. Nell'esempio seguente viene utilizzata un'implementazione personalizzata dei criteri di autorizzazione che verrà creata nella procedura successiva.
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
Il codice precedente restituisce una raccolta di criteri di autorizzazione nel CanValidateToken(SecurityToken) metodo . WCF non fornisce un'implementazione pubblica di questa interfaccia. La procedura seguente illustra come eseguire questa operazione per i propri requisiti.
Per creare criteri di autorizzazione personalizzati
Definire una nuova classe che implementa l'interfaccia IAuthorizationPolicy .
Implementare la Id proprietà di sola lettura. Un modo per implementare questa proprietà consiste nel generare un identificatore univoco globale (GUID) nel costruttore della classe e restituirlo ogni volta che viene richiesto il valore per questa proprietà.
Implementare la Issuer proprietà di sola lettura. Questa proprietà deve restituire l'emittente dei set di attestazioni ottenuti dal token. L'autorità emittente deve corrispondere all'autorità emittente del token o a un'autorità responsabile della convalida del contenuto del token. Nell'esempio seguente viene usata la dichiarazione emittente passata a questa classe dall'autenticatore personalizzato di token di sicurezza creato nella procedura precedente. L'autenticatore del token di sicurezza personalizzato usa il set di attestazioni fornito dal sistema (restituito dalla System proprietà) per rappresentare l'autorità emittente del token nome utente.
Implementa il metodo Evaluate. Questo metodo popola un'istanza della EvaluationContext classe (passata come argomento) con attestazioni basate sul contenuto del token di sicurezza in ingresso. Il metodo restituisce
truequando termina la valutazione. Nei casi in cui l'implementazione si basa sulla presenza di altri criteri di autorizzazione che forniscono informazioni aggiuntive al contesto di valutazione, questo metodo può restituirefalsese le informazioni necessarie non sono ancora presenti nel contesto di valutazione. In tal caso, WCF chiamerà nuovamente il metodo dopo aver valutato tutti gli altri criteri di autorizzazione generati per il messaggio in ingresso se almeno uno di questi criteri di autorizzazione ha modificato il contesto di valutazione.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
Procedura dettagliata: Creazione di credenziali client e servizio personalizzate descrive come creare credenziali personalizzate e un gestore di token di sicurezza personalizzato. Per usare l'autenticatore di token di sicurezza personalizzato creato qui, viene modificata un'implementazione del gestore token di sicurezza per restituire l'autenticatore personalizzato dal CreateSecurityTokenAuthenticator metodo . Il metodo restituisce un autenticatore quando viene passato un requisito di token di sicurezza appropriato.
Per integrare un autenticatore di token di sicurezza personalizzato con un gestore di token di sicurezza personalizzato
Sovrascrivere il CreateSecurityTokenAuthenticator metodo nel gestore di token di sicurezza personalizzato.
Aggiungere logica al metodo per abilitarlo a restituire l'autenticatore personalizzato del token di sicurezza in base al parametro SecurityTokenRequirement. Nell'esempio seguente viene restituito un autenticatore personalizzato per il token di sicurezza se il tipo di token richiesto è un nome utente (rappresentato dalla proprietà UserName) e la direzione del messaggio per cui viene richiesto è input (rappresentato dal 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