Vorgehensweise: Erstellen eines benutzerdefinierten SicherheitstokenauthentifizierersHow to: Create a Custom Security Token Authenticator

In diesem Thema wird beschrieben, wie Sie einen benutzerdefinierten Sicherheitstokenauthentifizierer erstellen und in einen benutzerdefinierten Sicherheitstoken-Manager integrieren.This topic shows how to create a custom security token authenticator and how to integrate it with a custom security token manager. Ein Sicherheitstokenauthentifizierer überprüft den Inhalt eines Sicherheitstokens, das mit einer eingehenden Nachricht bereitgestellt wird.A security token authenticator validates the content of a security token provided with an incoming message. Bei erfolgreicher Validierung gibt der Authentifizierer eine Sammlung von IAuthorizationPolicy-Instanzen zurück, die nach der Auswertung einen Satz von Ansprüchen zurückgeben.If the validation succeeds, the authenticator returns a collection of IAuthorizationPolicy instances that, when evaluated, returns a set of claims.

Zur Verwendung eines benutzerdefinierten Sicherheitstokenauthentifizierers in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) müssen Sie zunächst benutzerdefinierte Anmeldeinformationen und Sicherheitstoken-Manager-Implementierungen erstellen.To use a custom security token authenticator in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF), you must first create custom credentials and security token manager implementations. Weitere Informationen zum Erstellen von benutzerdefinierten Anmeldeinformationen und eine Sicherheits-Sicherheitstoken-Manager finden Sie unter Exemplarische Vorgehensweise: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen.For more information about creating custom credentials and a security token manager, see Walkthrough: Creating Custom Client and Service Credentials. Weitere Informationen zu Anmeldeinformationen und Sicherheitstoken-Manager-Anbieter und -Authentifizierer Klassen finden Sie unter Sicherheitsarchitektur.For more information about credentials, security token manager, and provider and authenticator classes, see Security Architecture.

VerfahrenProcedures

So erstellen Sie einen benutzerdefinierten SicherheitstokenauthentifiziererTo create a custom security token authenticator

  1. Definieren Sie eine neue von der SecurityTokenAuthenticator-Klasse abgeleitete Klasse.Define a new class derived from the SecurityTokenAuthenticator class.

  2. Überschreiben Sie die CanValidateTokenCore-Methode.Override the CanValidateTokenCore method. Die Methode gibt true oder false zurück, je nachdem, ob der benutzerdefinierte Authentifizierer den eingehenden Tokentyp auswerten kann oder nicht.The method returns true or false depending on whether the custom authenticator can validate the incoming token type or not.

  3. Überschreiben Sie die ValidateTokenCore-Methode.Override the ValidateTokenCore method. Diese Methode muss den Tokeninhalt entsprechend überprüfen.This method needs to validate the token contents appropriately. Wenn das Token den Validierungsschritt übergibt, gibt es eine Auflistung von IAuthorizationPolicy-Instanzen zurück.If the token passes the validation step, it returns a collection of IAuthorizationPolicy instances. Im folgenden Beispiel wird eine benutzerdefinierte Autorisierungsrichtlinienimplementierung, die in der nächsten Prozedur erstellt wird, verwendet.The following example uses a custom authorization policy implementation that will be created in the next procedure.

    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
    

Der vorherige Code gibt eine Auflistung von Autorisierungsrichtlinien in der CanValidateToken(SecurityToken)-Methode zurück.The previous code returns a collection of authorization policies in the CanValidateToken(SecurityToken) method. WCFWCF stellt keine öffentliche Implementierung dieser Schnittstelle zur Verfügung. does not provide a public implementation of this interface. Die folgende Prozedur zeigt, wie Sie diese Schritte Ihren eigenen Anforderungen entsprechend ausführen.The following procedure shows how to do so for your own requirements.

So erstellen Sie eine benutzerdefinierte AutorisierungsrichtlinieTo create a custom authorization policy

  1. Definieren Sie eine neue Klasse, die die IAuthorizationPolicy-Schnittstelle implementiert.Define a new class implementing the IAuthorizationPolicy interface.

  2. Implementieren Sie die schreibgeschützte Id-Eigenschaft.Implement the Id read-only property. Eine Möglichkeit, diese Eigenschaft zu implementieren, besteht darin, eine GUID (Globally Unique Identifier) im Klassenkonstruktor zu generieren und jedes Mal zurückzugeben, wenn der Wert für diese Eigenschaft angefordert wird.One way to implement this property is to generate a globally unique identifier (GUID) in the class constructor and return it every time the value for this property is requested.

  3. Implementieren Sie die schreibgeschützte Issuer-Eigenschaft.Implement the Issuer read-only property. Diese Eigenschaft muss einen Aussteller der Sätze von Ansprüchen zurückgeben, die aus dem Token abgerufen werden.This property needs to return an issuer of the claim sets that are obtained from the token. Dieser Aussteller sollte dem Aussteller des Tokens oder einer Autorität entsprechen, die für die Überprüfung der Tokeninhalte zuständig ist.This issuer should correspond to the issuer of the token or an authority that is responsible for validating the token contents. Im folgenden Beispiel wird der Ausstelleranspruch, der von dem in der vorherigen Prozedur erstellten benutzerdefinierten Sicherheitstokenauthentifizierer an diese Klasse übergeben wird, verwendet.The following example uses the issuer claim that passed to this class from the custom security token authenticator created in the previous procedure. Der benutzerdefinierte Sicherheitstokenauthentifizierer nutzt den vom System bereitgestellten Satz von Ansprüchen (der von der System-Eigenschaft zurückgegeben wird), um den Aussteller des Benutzernamentokens darzustellen.The custom security token authenticator uses the system-provided claim set (returned by the System property) to represent the issuer of the username token.

  4. Implementieren Sie die Evaluate-Methode.Implement the Evaluate method. Diese Methode füllt eine Instanz der EvaluationContext-Klasse (die als Argument weitergegeben wurde) mit Ansprüchen auf, die auf dem eingehenden Sicherheitstokeninhalt basieren.This method populates an instance of the EvaluationContext class (passed in as an argument) with claims that are based on the incoming security token content. Die Methode gibt true zurück, wenn der Vorgang mit der Evaluierung vorgenommen wird.The method returns true when it is done with the evaluation. In Fällen, in denen die Implementierung vom Vorhandensein anderer Autorisierungsrichtlinien abhängt, die zusätzliche Informationen zum Evaluierungskontext bieten, kann diese Methode false zurückgeben, wenn die erforderlichen Informationen noch nicht im Evaluierungskontext vorhanden sind.In cases when the implementation relies on the presence of other authorization policies that provide additional information to the evaluation context, this method can return false if the required information is not present yet in the evaluation context. In diesem Fall ruft WCFWCF die Methode erneut auf, nachdem alle anderen Autorisierungsrichtlinien, die für die eingehende Nachricht generiert wurden, überprüft wurden und festgestellt wurde, ob mindestens eine der Autorisierungsrichtlinien den Evaluierungskontext modifiziert hat.In that case, WCFWCF will call the method again after evaluating all other authorization policies generated for the incoming message if at least one of those authorization policies modified the evaluation context.

    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
    

Exemplarische Vorgehensweise: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen beschreibt, wie benutzerdefinierte Anmeldeinformationen und einen benutzerdefinierten sicherheitstokenmanager zu erstellen.Walkthrough: Creating Custom Client and Service Credentials describes how to create custom credentials and a custom security token manager. Zur Verwendung des hier erstellten benutzerdefinierten Sicherheitstokenauthentifizierers wird eine Implementierung des Sicherheitstoken-Managers so geändert, dass der benutzerdefinierte Authentifizierer von der CreateSecurityTokenAuthenticator-Methode zurückgegeben wird.To use the custom security token authenticator created here, an implementation of the security token manager is modified to return the custom authenticator from the CreateSecurityTokenAuthenticator method. Die Methode gibt einen Authentifizierer zurück, wenn eine entsprechende Sicherheitstokenanforderung übergeben wird.The method returns an authenticator when an appropriate security token requirement is passed in.

So integrieren Sie einen benutzerdefinierten Sicherheitstokenauthentifizierer mit einem benutzerdefinierten Sicherheitstoken-ManagerTo integrate a custom security token authenticator with a custom security token manager

  1. Überschreiben Sie die CreateSecurityTokenAuthenticator-Methode in der benutzerdefinierten Sicherheitstoken-Manager-Implementierung.Override the CreateSecurityTokenAuthenticator method in your custom security token manager implementation.

  2. Fügen Sie Logik zur Methode hinzu, um diese zu befähigen, Ihren benutzerdefinierten Sicherheitstokenauthentifizierer basierend auf dem SecurityTokenRequirement-Parameter zurückzugeben.Add logic to the method to enable it to return your custom security token authenticator based on the SecurityTokenRequirement parameter. Im folgenden Beispiel wird ein benutzerdefinierter Sicherheitstokenauthentifizierer zurückgegeben, wenn der Tokentyp der Tokenanforderungen ein Benutzername ist (der von der UserName-Eigenschaft dargestellt wird) und die Nachrichtenrichtung, für die der Sicherheitstokenauthentifizierer angefordert wird, eingegeben wird (dargestellt durch das Input-Feld).The following example returns a custom security token authenticator if the token requirements token type is a user name (represented by the UserName property) and the message direction for which the security token authenticator is being requested is input (represented by the Input field).

    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
    

Siehe auchSee Also

SecurityTokenAuthenticator
SecurityTokenRequirement
SecurityTokenManager
UserNameSecurityToken
Exemplarische Vorgehensweise: Erstellen von benutzerdefinierten Client- und DienstanmeldeinformationenWalkthrough: Creating Custom Client and Service Credentials
Vorgehensweise: Erstellen eines benutzerdefinierten SicherheitstokenanbietersHow to: Create a Custom Security Token Provider
SicherheitsarchitekturSecurity Architecture