//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- namespace System.IdentityModel.Tokens { using System; using System.Collections.Generic; /// /// A SecurityKeyIdentifierClause for referencing SAML2-based security tokens. /// public class Saml2AssertionKeyIdentifierClause : SecurityKeyIdentifierClause { /// /// Creates a Saml2AssertionKeyIdentifierClause for a given id. /// /// The id defining the clause to create. public Saml2AssertionKeyIdentifierClause(string id) : this(id, null, 0) { } /// /// Creates a Saml2AssertionKeyIdentifierClause for a given id. /// /// The id defining the clause to create. /// /// An array of System.Byte that contains the nonce that was used to create a /// derived key. Sets the value that is returned by the System.IdentityModel.Tokens.SecurityKeyIdentifierClause.GetDerivationNonce() /// method. /// /// The size of the derived key. Sets the value of the System.IdentityModel.Tokens.SecurityKeyIdentifierClause.DerivationLength /// property. /// public Saml2AssertionKeyIdentifierClause(string id, byte[] derivationNonce, int derivationLength) : base(null, derivationNonce, derivationLength) { if (string.IsNullOrEmpty(id)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("id"); } this.Id = id; } /// /// Indicates whether the for an assertion matches the specified . /// /// Id of the assertion /// A to match. /// 'True' if the keyIdentifier matches this. 'False' otherwise. public static bool Matches(string assertionId, SecurityKeyIdentifierClause keyIdentifierClause) { if (string.IsNullOrEmpty(assertionId)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("assertionId"); } if (null == keyIdentifierClause) { return false; } // Prefer our own type Saml2AssertionKeyIdentifierClause saml2Clause = keyIdentifierClause as Saml2AssertionKeyIdentifierClause; if (null != saml2Clause && StringComparer.Ordinal.Equals(assertionId, saml2Clause.Id)) { return true; } // For compatibility, match against the old WCF type. // WCF will read SAML2-based key identifier clauses if our // SecurityTokenSerializer doesn't get the chance. Unfortunately, // the TokenTypeUri and ValueType properties are internal, so // we can't check if they're for SAML2 or not. We're just going // to go with the fact that SAML Assertion IDs, in both versions, // are supposed to be sufficiently random as to not intersect. // So, if the AssertionID matches our Id, we'll say that's good // enough. SamlAssertionKeyIdentifierClause wcfClause = keyIdentifierClause as SamlAssertionKeyIdentifierClause; if (null != wcfClause && StringComparer.Ordinal.Equals(assertionId, wcfClause.AssertionId)) { return true; } // Out of options. return false; } /// /// Indicates whether the for this instance is matches the specified . /// /// A to match. /// True if the keyIdentifier matches this. False otherwise. public override bool Matches(SecurityKeyIdentifierClause keyIdentifierClause) { return ReferenceEquals(this, keyIdentifierClause) || Matches(Id, keyIdentifierClause); } /// /// Returns a that represents the current . /// /// The Id of this instance as a string. public override string ToString() { return "Saml2AssertionKeyIdentifierClause( Id = '" + Id + "' )"; } } }