185 lines
6.3 KiB
C#
185 lines
6.3 KiB
C#
|
//-----------------------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
namespace System.ServiceModel.Security
|
||
|
{
|
||
|
using System.Collections.Generic;
|
||
|
using System.Runtime;
|
||
|
using System.ServiceModel;
|
||
|
using System.ServiceModel.Channels;
|
||
|
using System.ServiceModel.Description;
|
||
|
|
||
|
public sealed class IssuedTokenClientCredential
|
||
|
{
|
||
|
SecurityKeyEntropyMode defaultKeyEntropyMode = AcceleratedTokenProvider.defaultKeyEntropyMode;
|
||
|
KeyedByTypeCollection<IEndpointBehavior> localIssuerChannelBehaviors;
|
||
|
Dictionary<Uri, KeyedByTypeCollection<IEndpointBehavior>> issuerChannelBehaviors;
|
||
|
bool cacheIssuedTokens = SpnegoTokenProvider.defaultClientCacheTokens;
|
||
|
TimeSpan maxIssuedTokenCachingTime = SpnegoTokenProvider.DefaultClientMaxTokenCachingTime;
|
||
|
EndpointAddress localIssuerAddress;
|
||
|
Binding localIssuerBinding;
|
||
|
int issuedTokenRenewalThresholdPercentage = AcceleratedTokenProvider.defaultServiceTokenValidityThresholdPercentage;
|
||
|
bool isReadOnly;
|
||
|
|
||
|
internal IssuedTokenClientCredential()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
internal IssuedTokenClientCredential(IssuedTokenClientCredential other)
|
||
|
{
|
||
|
this.defaultKeyEntropyMode = other.defaultKeyEntropyMode;
|
||
|
this.cacheIssuedTokens = other.cacheIssuedTokens;
|
||
|
this.issuedTokenRenewalThresholdPercentage = other.issuedTokenRenewalThresholdPercentage;
|
||
|
this.maxIssuedTokenCachingTime = other.maxIssuedTokenCachingTime;
|
||
|
this.localIssuerAddress = other.localIssuerAddress;
|
||
|
this.localIssuerBinding = (other.localIssuerBinding != null) ? new CustomBinding(other.localIssuerBinding) : null;
|
||
|
if (other.localIssuerChannelBehaviors != null)
|
||
|
this.localIssuerChannelBehaviors = GetBehaviorCollection(other.localIssuerChannelBehaviors);
|
||
|
if (other.issuerChannelBehaviors != null)
|
||
|
{
|
||
|
this.issuerChannelBehaviors = new Dictionary<Uri, KeyedByTypeCollection<IEndpointBehavior>>();
|
||
|
foreach (Uri uri in other.issuerChannelBehaviors.Keys)
|
||
|
{
|
||
|
this.issuerChannelBehaviors.Add(uri, GetBehaviorCollection(other.issuerChannelBehaviors[uri]));
|
||
|
}
|
||
|
}
|
||
|
this.isReadOnly = other.isReadOnly;
|
||
|
}
|
||
|
|
||
|
public EndpointAddress LocalIssuerAddress
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.localIssuerAddress;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
ThrowIfImmutable();
|
||
|
this.localIssuerAddress = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public Binding LocalIssuerBinding
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.localIssuerBinding;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
ThrowIfImmutable();
|
||
|
this.localIssuerBinding = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public SecurityKeyEntropyMode DefaultKeyEntropyMode
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.defaultKeyEntropyMode;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
SecurityKeyEntropyModeHelper.Validate(value);
|
||
|
ThrowIfImmutable();
|
||
|
this.defaultKeyEntropyMode = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool CacheIssuedTokens
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.cacheIssuedTokens;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
ThrowIfImmutable();
|
||
|
this.cacheIssuedTokens = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int IssuedTokenRenewalThresholdPercentage
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.issuedTokenRenewalThresholdPercentage;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
ThrowIfImmutable();
|
||
|
this.issuedTokenRenewalThresholdPercentage = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public Dictionary<Uri, KeyedByTypeCollection<IEndpointBehavior>> IssuerChannelBehaviors
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (this.issuerChannelBehaviors == null)
|
||
|
this.issuerChannelBehaviors = new Dictionary<Uri, KeyedByTypeCollection<IEndpointBehavior>>();
|
||
|
return this.issuerChannelBehaviors;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public KeyedByTypeCollection<IEndpointBehavior> LocalIssuerChannelBehaviors
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (this.localIssuerChannelBehaviors == null)
|
||
|
this.localIssuerChannelBehaviors = new KeyedByTypeCollection<IEndpointBehavior>();
|
||
|
return this.localIssuerChannelBehaviors;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public TimeSpan MaxIssuedTokenCachingTime
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.maxIssuedTokenCachingTime;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
if (value < TimeSpan.Zero)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", value,
|
||
|
SR.GetString(SR.SFxTimeoutOutOfRange0)));
|
||
|
}
|
||
|
|
||
|
if (TimeoutHelper.IsTooLarge(value))
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", value,
|
||
|
SR.GetString(SR.SFxTimeoutOutOfRangeTooBig)));
|
||
|
}
|
||
|
|
||
|
ThrowIfImmutable();
|
||
|
this.maxIssuedTokenCachingTime = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
KeyedByTypeCollection<IEndpointBehavior> GetBehaviorCollection(KeyedByTypeCollection<IEndpointBehavior> behaviors)
|
||
|
{
|
||
|
KeyedByTypeCollection<IEndpointBehavior> result = new KeyedByTypeCollection<IEndpointBehavior>();
|
||
|
foreach (IEndpointBehavior behavior in behaviors)
|
||
|
{
|
||
|
result.Add(behavior);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
internal void MakeReadOnly()
|
||
|
{
|
||
|
this.isReadOnly = true;
|
||
|
}
|
||
|
|
||
|
void ThrowIfImmutable()
|
||
|
{
|
||
|
if (this.isReadOnly)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ObjectIsReadOnly)));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|