Bagikan melalui


SecurityTokenHandler.ValidateToken(SecurityToken) Metode

Definisi

Saat ditimpa di kelas turunan, validasi token keamanan yang ditentukan. Token harus dari jenis yang diproses oleh kelas turunan.

public:
 virtual System::Collections::ObjectModel::ReadOnlyCollection<System::Security::Claims::ClaimsIdentity ^> ^ ValidateToken(System::IdentityModel::Tokens::SecurityToken ^ token);
public virtual System.Collections.ObjectModel.ReadOnlyCollection<System.Security.Claims.ClaimsIdentity> ValidateToken (System.IdentityModel.Tokens.SecurityToken token);
abstract member ValidateToken : System.IdentityModel.Tokens.SecurityToken -> System.Collections.ObjectModel.ReadOnlyCollection<System.Security.Claims.ClaimsIdentity>
override this.ValidateToken : System.IdentityModel.Tokens.SecurityToken -> System.Collections.ObjectModel.ReadOnlyCollection<System.Security.Claims.ClaimsIdentity>
Public Overridable Function ValidateToken (token As SecurityToken) As ReadOnlyCollection(Of ClaimsIdentity)

Parameter

token
SecurityToken

Token untuk divalidasi.

Mengembalikan

Identitas yang terkandung dalam token.

Contoh

Kode berikut menunjukkan penimpaan ValidateToken metode untuk penangan token keamanan yang memproses token web sederhana (SWT). Kode diambil dari CustomToken sampel. Untuk informasi tentang sampel ini dan sampel lain yang tersedia untuk WIF dan tempat mengunduhnya, lihat Indeks Sampel Kode WIF.

/// <summary>
/// This method validates the Simple Web Token.
/// </summary>
/// <param name="token">A simple web token.</param>
/// <returns>A Claims Collection which contains all the claims from the token.</returns>
public override ReadOnlyCollection<ClaimsIdentity> ValidateToken(SecurityToken token)
{
    if ( token == null )
    {
        throw new ArgumentNullException( "token" );
    }

    SimpleWebToken simpleWebToken = token as SimpleWebToken;
    if ( simpleWebToken == null )
    {
        throw new ArgumentException("The token provided must be of type SimpleWebToken.");                    
    }

    if ( DateTime.Compare( simpleWebToken.ValidTo.Add( Configuration.MaxClockSkew ), DateTime.UtcNow ) <= 0 )
    {
        throw new SecurityTokenExpiredException("The incoming token has expired. Get a new access token from the Authorization Server.");
    }

    ValidateSignature( simpleWebToken );
 
    ValidateAudience( simpleWebToken.Audience );
 
    ClaimsIdentity claimsIdentity = CreateClaims( simpleWebToken );
   
    if (this.Configuration.SaveBootstrapContext)
    {
        claimsIdentity.BootstrapContext = new BootstrapContext(simpleWebToken.SerializedToken);
    }

    List<ClaimsIdentity> claimCollection = new List<ClaimsIdentity>(new ClaimsIdentity[] { claimsIdentity });
    return claimCollection.AsReadOnly();
}

Kode berikut menunjukkan CreateClaims metode yang dipanggil dari penimpaan ValidateToken metode dalam contoh sebelumnya. Metode ini mengembalikan ClaimsIdentity objek yang dibuat dari klaim dalam token. Kode diambil dari CustomToken sampel. Untuk informasi tentang sampel ini dan sampel lain yang tersedia untuk WIF dan tempat mengunduhnya, lihat Indeks Sampel Kode WIF.

/// <summary>Creates <see cref="Claim"/>'s from the incoming token.
/// </summary>
/// <param name="simpleWebToken">The incoming <see cref="SimpleWebToken"/>.</param>
/// <returns>A <see cref="ClaimsIdentity"/> created from the token.</returns>
protected virtual ClaimsIdentity CreateClaims( SimpleWebToken simpleWebToken )
{
    if ( simpleWebToken == null )
    {
        throw new ArgumentNullException( "simpleWebToken" );
    }

    NameValueCollection tokenProperties = simpleWebToken.GetAllProperties();
    if ( tokenProperties == null )
    {
        throw new SecurityTokenValidationException( "No claims can be created from this Simple Web Token." );
    }

    if ( Configuration.IssuerNameRegistry == null )
    {
        throw new InvalidOperationException( "The Configuration.IssuerNameRegistry property of this SecurityTokenHandler is set to null. Tokens cannot be validated in this state." );
    }

    string normalizedIssuer = Configuration.IssuerNameRegistry.GetIssuerName( simpleWebToken );

    ClaimsIdentity identity = new ClaimsIdentity(AuthenticationTypes.Federation);
    
    foreach ( string key in tokenProperties.Keys )
    {
        if ( ! IsReservedKeyName(key) &&  !string.IsNullOrEmpty( tokenProperties[key] ) )
        {
            identity.AddClaim( new Claim( key, tokenProperties[key], ClaimValueTypes.String, normalizedIssuer ) );
            if ( key == AcsNameClaimType )
            {
                // add a default name claim from the Name identifier claim.
                identity.AddClaim( new Claim( DefaultNameClaimType, tokenProperties[key], ClaimValueTypes.String, normalizedIssuer ) );
            }
        }
    }

    return identity;
}

Kode berikut menunjukkan ValidateSignature metode yang dipanggil dari penimpaan ValidateToken metode dalam handler token web sederhana. Metode ini memvalidasi tanda tangan pada token dengan menggunakan yang dikonfigurasi IssuerTokenResolver. Kode diambil dari CustomToken sampel. Untuk informasi tentang sampel ini dan sampel lain yang tersedia untuk WIF dan tempat mengunduhnya, lihat Indeks Sampel Kode WIF.

/// <summary>
/// Validates the signature on the incoming token.
/// </summary>
/// <param name="simpleWebToken">The incoming <see cref="SimpleWebToken"/>.</param>
protected virtual void ValidateSignature( SimpleWebToken simpleWebToken )
{
    if ( simpleWebToken == null )
    {
        throw new ArgumentNullException( "simpleWebToken" );
    }

    if ( String.IsNullOrEmpty( simpleWebToken.SerializedToken ) || String.IsNullOrEmpty( simpleWebToken.Signature ) )
    {
        throw new SecurityTokenValidationException( "The token does not have a signature to verify" );
    }

    string serializedToken = simpleWebToken.SerializedToken;           
    string unsignedToken = null;

    // Find the last parameter. The signature must be last per SWT specification.
    int lastSeparator = serializedToken.LastIndexOf( ParameterSeparator );

    // Check whether the last parameter is an hmac.
    if ( lastSeparator > 0 )
    {
        string lastParamStart = ParameterSeparator + SimpleWebTokenConstants.Signature + "=";
        string lastParam = serializedToken.Substring( lastSeparator );

        // Strip the trailing hmac to obtain the original unsigned string for later hmac verification.               
        if ( lastParam.StartsWith( lastParamStart, StringComparison.Ordinal ) )
        {
            unsignedToken = serializedToken.Substring( 0, lastSeparator );
        }
    }

    SimpleWebTokenKeyIdentifierClause clause = new SimpleWebTokenKeyIdentifierClause(simpleWebToken.Audience);
    InMemorySymmetricSecurityKey securityKey = null;
    try
    {
        securityKey = (InMemorySymmetricSecurityKey)this.Configuration.IssuerTokenResolver.ResolveSecurityKey(clause);
    }
    catch (InvalidOperationException)
    {
        throw new SecurityTokenValidationException( "A Symmetric key was not found for the given key identifier clause.");
    }

    string generatedSignature = GenerateSignature( unsignedToken, securityKey.GetSymmetricKey() );

    if ( string.CompareOrdinal( generatedSignature, simpleWebToken.Signature ) != 0 )
    {
        throw new SecurityTokenValidationException( "The signature on the incoming token is invalid.") ;
    }
}
/// <summary>
/// Generates an HMACSHA256 signature for a given string and key.
/// </summary>
/// <param name="unsignedToken">The token to be signed.</param>
/// <param name="signingKey">The key used to generate the signature.</param>
/// <returns>The generated signature.</returns>
protected static string GenerateSignature(string unsignedToken, byte[] signingKey)
{
    using (HMACSHA256 hmac = new HMACSHA256(signingKey))
    {
        byte[] signatureBytes = hmac.ComputeHash(Encoding.ASCII.GetBytes(unsignedToken));
        string signature = HttpUtility.UrlEncode(Convert.ToBase64String(signatureBytes));

        return signature;
    }
}

Kode berikut menunjukkan ValidateAudience metode yang dipanggil dari penimpaan ValidateToken metode dalam handler token web sederhana. Metode ini memvalidasi audiens yang terkandung dalam token terhadap URI audiens yang ditentukan dalam konfigurasi. Kode diambil dari CustomToken sampel. Untuk informasi tentang sampel ini dan sampel lain yang tersedia untuk WIF dan tempat mengunduhnya, lihat Indeks Sampel Kode WIF.

/// <summary>
/// Validates the audience of the incoming token with those specified in configuration.
/// </summary>
/// <param name="tokenAudience">The audience of the incoming token.</param>
protected virtual void ValidateAudience( string tokenAudience )
{
    if ( Configuration.AudienceRestriction.AudienceMode != AudienceUriMode.Never )
    {
        if ( String.IsNullOrEmpty( tokenAudience ) )
        {
            throw new SecurityTokenValidationException("The incoming token does not have a valid audience Uri and the Audience Restriction is not set to 'None'.");
        }

        if ( Configuration.AudienceRestriction.AllowedAudienceUris.Count == 0 )
        {
            throw new InvalidOperationException( " Audience Restriction is not set to 'None' but no valid audience URI's are configured." );
        }

        IList<Uri> allowedAudienceUris = Configuration.AudienceRestriction.AllowedAudienceUris;
        
        Uri audienceUri = null;

        Uri.TryCreate(tokenAudience, UriKind.RelativeOrAbsolute, out audienceUri);
        
        // Strip off any query string or fragment. 
        Uri audienceLeftPart;

        if ( audienceUri.IsAbsoluteUri )
        {
            audienceLeftPart = new Uri( audienceUri.GetLeftPart( UriPartial.Path ) );
        }
        else
        {
            Uri baseUri = new Uri( "http://www.example.com" );
            Uri resolved = new Uri( baseUri, tokenAudience );
            audienceLeftPart = baseUri.MakeRelativeUri( new Uri( resolved.GetLeftPart( UriPartial.Path ) ) );
        }

        if ( !allowedAudienceUris.Contains( audienceLeftPart ) )
        {
            throw new AudienceUriValidationFailedException(
                    "The Audience Uri of the incoming token is not present in the list of permitted Audience Uri's.");
        }
    }
}

Keterangan

Secara default metode ini memberikan NotImplementedException pengecualian.

Metode ValidateToken ini dipanggil oleh infrastruktur untuk memvalidasi dan mengekstrak klaim dari token keamanan yang dideserialisasi. Klaim ini dikembalikan dalam pengumpulan ClaimsIdentity objek yang dikembalikan oleh metode . Dalam kasus umumnya, koleksi ini akan berisi satu identitas.

Dalam kelas turunan, validasi biasanya mencakup memvalidasi audiens yang dimaksudkan yang ditentukan dalam token terhadap URI audiens yang ditentukan dalam SecurityTokenHandlerConfiguration.AudienceRestriction properti objek konfigurasi handler token yang ditentukan pada Configuration properti . URI ini biasanya diatur dalam file konfigurasi di bawah <elemen audienceUris> . Jika audiens tidak dapat divalidasi, AudienceUriValidationFailedException pengecualian harus dilemparkan.

Saat memproses token, penerbit biasanya divalidasi dengan meneruskan token penerbit ke salah GetIssuerName satu metode pada objek yang dikonfigurasi IssuerNameRegistry untuk handler melalui Configuration properti . Registri nama penerbit biasanya dikonfigurasi melalui <elemen issuerNameRegistry> dalam file konfigurasi. mengembalikan GetIssuerName nama pengeluar sertifikat. Nama ini harus digunakan untuk mengatur Claim.Issuer properti dalam klaim yang terkandung dalam token. Jika registri nullnama penerbit tidak berisi entri untuk token penerbit, GetIssuerName mengembalikan . Dalam hal SecurityTokenException ini biasanya dilemparkan dalam kelas turunan, tetapi perilaku ini terserah perancang kelas.

Berlaku untuk