206 lines
8.2 KiB
C#
206 lines
8.2 KiB
C#
|
//-----------------------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
namespace System.ServiceModel.Security.Tokens
|
||
|
{
|
||
|
using System.ServiceModel.Security;
|
||
|
using System.ServiceModel.Channels;
|
||
|
using System.ServiceModel;
|
||
|
using System.Text;
|
||
|
using System.Globalization;
|
||
|
using System.IdentityModel.Selectors;
|
||
|
using System.IdentityModel.Tokens;
|
||
|
|
||
|
public abstract class SecurityTokenParameters
|
||
|
{
|
||
|
internal const SecurityTokenInclusionMode defaultInclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
|
||
|
internal const SecurityTokenReferenceStyle defaultReferenceStyle = SecurityTokenReferenceStyle.Internal;
|
||
|
internal const bool defaultRequireDerivedKeys = true;
|
||
|
|
||
|
SecurityTokenInclusionMode inclusionMode = defaultInclusionMode;
|
||
|
SecurityTokenReferenceStyle referenceStyle = defaultReferenceStyle;
|
||
|
bool requireDerivedKeys = defaultRequireDerivedKeys;
|
||
|
|
||
|
protected SecurityTokenParameters(SecurityTokenParameters other)
|
||
|
{
|
||
|
if (other == null)
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("other");
|
||
|
|
||
|
this.requireDerivedKeys = other.requireDerivedKeys;
|
||
|
this.inclusionMode = other.inclusionMode;
|
||
|
this.referenceStyle = other.referenceStyle;
|
||
|
}
|
||
|
|
||
|
protected SecurityTokenParameters()
|
||
|
{
|
||
|
// empty
|
||
|
}
|
||
|
|
||
|
internal protected abstract bool HasAsymmetricKey { get; }
|
||
|
|
||
|
public SecurityTokenInclusionMode InclusionMode
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.inclusionMode;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
SecurityTokenInclusionModeHelper.Validate(value);
|
||
|
this.inclusionMode = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public SecurityTokenReferenceStyle ReferenceStyle
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.referenceStyle;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
TokenReferenceStyleHelper.Validate(value);
|
||
|
this.referenceStyle = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool RequireDerivedKeys
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.requireDerivedKeys;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.requireDerivedKeys = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal protected abstract bool SupportsClientAuthentication { get; }
|
||
|
internal protected abstract bool SupportsServerAuthentication { get; }
|
||
|
internal protected abstract bool SupportsClientWindowsIdentity { get; }
|
||
|
|
||
|
public SecurityTokenParameters Clone()
|
||
|
{
|
||
|
SecurityTokenParameters result = this.CloneCore();
|
||
|
|
||
|
if (result == null)
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SecurityTokenParametersCloneInvalidResult, this.GetType().ToString())));
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
protected abstract SecurityTokenParameters CloneCore();
|
||
|
|
||
|
internal protected abstract SecurityKeyIdentifierClause CreateKeyIdentifierClause(SecurityToken token, SecurityTokenReferenceStyle referenceStyle);
|
||
|
|
||
|
internal protected abstract void InitializeSecurityTokenRequirement(SecurityTokenRequirement requirement);
|
||
|
|
||
|
internal SecurityKeyIdentifierClause CreateKeyIdentifierClause<TExternalClause, TInternalClause>(SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
|
||
|
where TExternalClause : SecurityKeyIdentifierClause
|
||
|
where TInternalClause : SecurityKeyIdentifierClause
|
||
|
{
|
||
|
if (token == null)
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
|
||
|
|
||
|
SecurityKeyIdentifierClause result;
|
||
|
|
||
|
switch (referenceStyle)
|
||
|
{
|
||
|
default:
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(
|
||
|
SR.GetString(SR.TokenDoesNotSupportKeyIdentifierClauseCreation, token.GetType().Name, referenceStyle)));
|
||
|
case SecurityTokenReferenceStyle.External:
|
||
|
result = token.CreateKeyIdentifierClause<TExternalClause>();
|
||
|
break;
|
||
|
case SecurityTokenReferenceStyle.Internal:
|
||
|
result = token.CreateKeyIdentifierClause<TInternalClause>();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
internal SecurityKeyIdentifierClause CreateGenericXmlTokenKeyIdentifierClause(SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
|
||
|
{
|
||
|
GenericXmlSecurityToken xmlToken = token as GenericXmlSecurityToken;
|
||
|
if (xmlToken != null)
|
||
|
{
|
||
|
if (referenceStyle == SecurityTokenReferenceStyle.Internal && xmlToken.InternalTokenReference != null)
|
||
|
return xmlToken.InternalTokenReference;
|
||
|
|
||
|
if (referenceStyle == SecurityTokenReferenceStyle.External && xmlToken.ExternalTokenReference != null)
|
||
|
return xmlToken.ExternalTokenReference;
|
||
|
}
|
||
|
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.UnableToCreateTokenReference)));
|
||
|
}
|
||
|
|
||
|
internal protected virtual bool MatchesKeyIdentifierClause(SecurityToken token, SecurityKeyIdentifierClause keyIdentifierClause, SecurityTokenReferenceStyle referenceStyle)
|
||
|
{
|
||
|
if (token == null)
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
|
||
|
|
||
|
if (token is GenericXmlSecurityToken)
|
||
|
{
|
||
|
return MatchesGenericXmlTokenKeyIdentifierClause(token, keyIdentifierClause, referenceStyle);
|
||
|
}
|
||
|
|
||
|
bool result;
|
||
|
|
||
|
switch (referenceStyle)
|
||
|
{
|
||
|
default:
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(
|
||
|
SR.GetString(SR.TokenDoesNotSupportKeyIdentifierClauseCreation, token.GetType().Name, referenceStyle)));
|
||
|
case SecurityTokenReferenceStyle.External:
|
||
|
if (keyIdentifierClause is LocalIdKeyIdentifierClause)
|
||
|
result = false;
|
||
|
else
|
||
|
result = token.MatchesKeyIdentifierClause(keyIdentifierClause);
|
||
|
break;
|
||
|
case SecurityTokenReferenceStyle.Internal:
|
||
|
result = token.MatchesKeyIdentifierClause(keyIdentifierClause);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
internal bool MatchesGenericXmlTokenKeyIdentifierClause(SecurityToken token, SecurityKeyIdentifierClause keyIdentifierClause, SecurityTokenReferenceStyle referenceStyle)
|
||
|
{
|
||
|
if (token == null)
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
|
||
|
|
||
|
bool result;
|
||
|
|
||
|
GenericXmlSecurityToken xmlToken = token as GenericXmlSecurityToken;
|
||
|
|
||
|
if (xmlToken == null)
|
||
|
result = false;
|
||
|
else if (referenceStyle == SecurityTokenReferenceStyle.External && xmlToken.ExternalTokenReference != null)
|
||
|
result = xmlToken.ExternalTokenReference.Matches(keyIdentifierClause);
|
||
|
else if (referenceStyle == SecurityTokenReferenceStyle.Internal)
|
||
|
result = xmlToken.MatchesKeyIdentifierClause(keyIdentifierClause);
|
||
|
else
|
||
|
result = false;
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
public override string ToString()
|
||
|
{
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
|
||
|
sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "{0}:", this.GetType().ToString()));
|
||
|
sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "InclusionMode: {0}", this.inclusionMode.ToString()));
|
||
|
sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "ReferenceStyle: {0}", this.referenceStyle.ToString()));
|
||
|
sb.Append(String.Format(CultureInfo.InvariantCulture, "RequireDerivedKeys: {0}", this.requireDerivedKeys.ToString()));
|
||
|
|
||
|
return sb.ToString();
|
||
|
}
|
||
|
}
|
||
|
}
|