//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IdentityModel.Policy;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Claims;
namespace System.ServiceModel.Security
{
///
/// Wraps a Saml2SecurityTokenHandler. Delegates the token authentication call to
/// this wrapped tokenAuthenticator. Wraps the returned ClaimsIdentities into
/// an IAuthorizationPolicy.
///
internal class WrappedSaml2SecurityTokenAuthenticator : SecurityTokenAuthenticator
{
Saml2SecurityTokenHandler _wrappedSaml2SecurityTokenHandler;
ExceptionMapper _exceptionMapper;
///
/// Initializes an instance of
///
/// The Saml2SecurityTokenHandler to wrap.
/// Converts token validation exceptions to SOAP faults.
public WrappedSaml2SecurityTokenAuthenticator(
Saml2SecurityTokenHandler saml2SecurityTokenHandler,
ExceptionMapper exceptionMapper )
{
if ( saml2SecurityTokenHandler == null )
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull( "wrappedSaml2SecurityTokenHandler" );
}
if ( exceptionMapper == null )
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull( "exceptionMapper" );
}
_wrappedSaml2SecurityTokenHandler = saml2SecurityTokenHandler;
_exceptionMapper = exceptionMapper;
}
///
/// Checks if the given token can be validated. Returns true if the token is of type
/// Saml2SecurityToken and if the wrapped SecurityTokenHandler can validate tokens.
///
/// The token to be checked.
/// True if the token is of type Saml2SecurityToken and if the wrapped
/// SecurityTokenHandler can validate tokens.
protected override bool CanValidateTokenCore( SecurityToken token )
{
return (token is Saml2SecurityToken) && _wrappedSaml2SecurityTokenHandler.CanValidateToken;
}
///
/// Validates the token using the wrapped token handler and generates IAuthorizationPolicy
/// wrapping the returned ClaimsIdentities.
///
/// Token to be validated.
/// Read-only collection of IAuthorizationPolicy
protected override ReadOnlyCollection ValidateTokenCore( SecurityToken token )
{
IEnumerable identities = null;
try
{
identities = _wrappedSaml2SecurityTokenHandler.ValidateToken( token );
}
catch ( Exception ex )
{
if ( !_exceptionMapper.HandleSecurityTokenProcessingException( ex ) )
{
throw;
}
}
List policies = new List(1);
policies.Add(new AuthorizationPolicy(identities));
return policies.AsReadOnly();
}
}
}