Procedure: een aangepaste beveiligingstoken authenticator maken
In dit onderwerp wordt beschreven hoe u een aangepaste beveiligingstoken authenticator maakt en hoe u dit integreert met een aangepast beveiligingstokenbeheer. Een beveiligingstoken authenticator valideert de inhoud van een beveiligingstoken dat wordt geleverd met een binnenkomend bericht. Als de validatie slaagt, retourneert de verificator een verzameling IAuthorizationPolicy exemplaren die, wanneer deze worden geëvalueerd, een set claims retourneert.
Als u een aangepaste beveiligingstoken authenticator in Windows Communication Foundation (WCF) wilt gebruiken, moet u eerst aangepaste referenties en implementaties voor beveiligingstokenbeheer maken. Zie Overzicht: Aangepaste client- en servicereferenties maken voor meer informatie over het maken van aangepaste referenties en een beveiligingstokenbeheer.
Procedures
Een aangepaste beveiligingstoken-verificator maken
Definieer een nieuwe klasse die is afgeleid van de SecurityTokenAuthenticator klasse.
Overschrijf de CanValidateTokenCore methode. De methode retourneert
true
of afhankelijk van offalse
de aangepaste verificator het binnenkomende tokentype kan valideren of niet.Overschrijf de ValidateTokenCore methode. Deze methode moet de inhoud van het token op de juiste wijze valideren. Als het token de validatiestap doorgeeft, wordt er een verzameling IAuthorizationPolicy exemplaren geretourneerd. In het volgende voorbeeld wordt een aangepaste implementatie van het autorisatiebeleid gebruikt die in de volgende procedure wordt gemaakt.
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
De vorige code retourneert een verzameling autorisatiebeleidsregels in de CanValidateToken(SecurityToken) methode. WCF biedt geen openbare implementatie van deze interface. In de volgende procedure ziet u hoe u dit doet voor uw eigen vereisten.
Een aangepast autorisatiebeleid maken
Definieer een nieuwe klasse die de IAuthorizationPolicy interface implementeert.
Implementeer de Id eigenschap Alleen-lezen. Een manier om deze eigenschap te implementeren, is door een GUID (Globally Unique Identifier) te genereren in de klasseconstructor en deze telkens te retourneren wanneer de waarde voor deze eigenschap wordt aangevraagd.
Implementeer de Issuer eigenschap Alleen-lezen. Deze eigenschap moet een uitgever retourneren van de claimsets die zijn verkregen van het token. Deze uitgever moet overeenkomen met de uitgever van het token of een instantie die verantwoordelijk is voor het valideren van de inhoud van het token. In het volgende voorbeeld wordt de verlenerclaim gebruikt die aan deze klasse is doorgegeven vanuit de aangepaste beveiligingstoken authenticator die in de vorige procedure is gemaakt. De aangepaste beveiligingstokenverificator maakt gebruik van de door het systeem geleverde claimset (geretourneerd door de System eigenschap) om de verlener van het gebruikersnaamtoken weer te geven.
Implementeer de Evaluate methode. Met deze methode wordt een exemplaar van de EvaluationContext klasse ingevuld (doorgegeven als argument) met claims die zijn gebaseerd op de inhoud van het binnenkomende beveiligingstoken. De methode retourneert
true
wanneer deze wordt uitgevoerd met de evaluatie. In gevallen waarin de implementatie afhankelijk is van de aanwezigheid van ander autorisatiebeleid dat aanvullende informatie aan de evaluatiecontext biedt, kan deze methode worden geretourneerdfalse
als de vereiste informatie nog niet aanwezig is in de evaluatiecontext. In dat geval roept WCF de methode opnieuw aan nadat alle andere autorisatiebeleidsregels zijn geëvalueerd die zijn gegenereerd voor het binnenkomende bericht als ten minste één van deze autorisatiebeleidsregels de evaluatiecontext heeft gewijzigd.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
Overzicht: Het maken van aangepaste client- en servicereferenties beschrijft hoe u aangepaste referenties en een aangepast beveiligingstokenbeheer maakt. Als u de aangepaste beveiligingstoken authenticator wilt gebruiken die hier is gemaakt, wordt een implementatie van het beveiligingstokenbeheer gewijzigd om de aangepaste verificator van de CreateSecurityTokenAuthenticator methode te retourneren. De methode retourneert een verificator wanneer een geschikte beveiligingstokenvereiste wordt doorgegeven.
Een aangepaste beveiligingstoken authenticator integreren met een aangepast beveiligingstokenbeheer
Overschrijf de methode in de CreateSecurityTokenAuthenticator implementatie van uw aangepaste beveiligingstokenbeheer.
Voeg logica toe aan de methode om deze in te schakelen voor het retourneren van uw aangepaste beveiligingstoken-verificator op basis van de SecurityTokenRequirement parameter. In het volgende voorbeeld wordt een aangepaste beveiligingstoken-verificator geretourneerd als het tokentype token een gebruikersnaam is (vertegenwoordigd door de UserName eigenschap) en de berichtrichting waarvoor de verificator voor beveiligingstokens wordt aangevraagd, invoer is (vertegenwoordigd door het Input veld).
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