//-----------------------------------------------------------------------
//
// 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 + "' )";
}
}
}