202 lines
6.2 KiB
C#
202 lines
6.2 KiB
C#
|
//------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//------------------------------------------------------------
|
||
|
namespace System.ServiceModel.Channels
|
||
|
{
|
||
|
using System.IdentityModel.Selectors;
|
||
|
using System.IdentityModel.Tokens;
|
||
|
using System.Runtime;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.ServiceModel;
|
||
|
using System.ServiceModel.Security;
|
||
|
using System.ServiceModel.Security.Tokens;
|
||
|
|
||
|
abstract class MsmqChannelFactoryBase<TChannel> : TransportChannelFactory<TChannel>
|
||
|
{
|
||
|
MsmqUri.IAddressTranslator addressTranslator;
|
||
|
Uri customDeadLetterQueue;
|
||
|
bool durable;
|
||
|
DeadLetterQueue deadLetterQueue;
|
||
|
string deadLetterQueuePathName;
|
||
|
bool exactlyOnce = true;
|
||
|
TimeSpan timeToLive;
|
||
|
MsmqTransportSecurity msmqTransportSecurity;
|
||
|
bool useMsmqTracing;
|
||
|
bool useSourceJournal;
|
||
|
SecurityTokenManager securityTokenManager;
|
||
|
|
||
|
protected MsmqChannelFactoryBase(MsmqBindingElementBase bindingElement, BindingContext context) :
|
||
|
this(bindingElement, context, TransportDefaults.GetDefaultMessageEncoderFactory())
|
||
|
{ }
|
||
|
|
||
|
|
||
|
protected MsmqChannelFactoryBase(MsmqBindingElementBase bindingElement, BindingContext context, MessageEncoderFactory encoderFactory)
|
||
|
: base(bindingElement, context)
|
||
|
{
|
||
|
this.addressTranslator = bindingElement.AddressTranslator;
|
||
|
this.customDeadLetterQueue = bindingElement.CustomDeadLetterQueue;
|
||
|
this.durable = bindingElement.Durable;
|
||
|
this.deadLetterQueue = bindingElement.DeadLetterQueue;
|
||
|
this.exactlyOnce = bindingElement.ExactlyOnce;
|
||
|
this.msmqTransportSecurity = new MsmqTransportSecurity(bindingElement.MsmqTransportSecurity);
|
||
|
this.timeToLive = bindingElement.TimeToLive;
|
||
|
this.useMsmqTracing = bindingElement.UseMsmqTracing;
|
||
|
this.useSourceJournal = bindingElement.UseSourceJournal;
|
||
|
|
||
|
if (this.MsmqTransportSecurity.MsmqAuthenticationMode == MsmqAuthenticationMode.Certificate)
|
||
|
{
|
||
|
InitializeSecurityTokenManager(context);
|
||
|
}
|
||
|
|
||
|
if (null != this.customDeadLetterQueue)
|
||
|
this.deadLetterQueuePathName = MsmqUri.DeadLetterQueueAddressTranslator.UriToFormatName(this.customDeadLetterQueue);
|
||
|
}
|
||
|
|
||
|
internal MsmqUri.IAddressTranslator AddressTranslator
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.addressTranslator;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public Uri CustomDeadLetterQueue
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.customDeadLetterQueue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public DeadLetterQueue DeadLetterQueue
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.deadLetterQueue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal string DeadLetterQueuePathName
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.deadLetterQueuePathName;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool Durable
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.durable;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool ExactlyOnce
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.exactlyOnce;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
public MsmqTransportSecurity MsmqTransportSecurity
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.msmqTransportSecurity;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override string Scheme
|
||
|
{
|
||
|
get { return this.addressTranslator.Scheme; }
|
||
|
}
|
||
|
|
||
|
public TimeSpan TimeToLive
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.timeToLive;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public SecurityTokenManager SecurityTokenManager
|
||
|
{
|
||
|
get { return this.securityTokenManager; }
|
||
|
}
|
||
|
|
||
|
public bool UseSourceJournal
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.useSourceJournal;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool UseMsmqTracing
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.useMsmqTracing;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal bool IsMsmqX509SecurityConfigured
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return (MsmqAuthenticationMode.Certificate == this.MsmqTransportSecurity.MsmqAuthenticationMode);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||
|
void InitializeSecurityTokenManager(BindingContext context)
|
||
|
{
|
||
|
SecurityCredentialsManager credentials = context.BindingParameters.Find<SecurityCredentialsManager>();
|
||
|
if (credentials != null)
|
||
|
this.securityTokenManager = credentials.CreateSecurityTokenManager();
|
||
|
}
|
||
|
|
||
|
|
||
|
internal SecurityTokenProvider CreateTokenProvider(EndpointAddress to, Uri via)
|
||
|
{
|
||
|
InitiatorServiceModelSecurityTokenRequirement x509Requirement = new InitiatorServiceModelSecurityTokenRequirement();
|
||
|
x509Requirement.TokenType = SecurityTokenTypes.X509Certificate;
|
||
|
x509Requirement.TargetAddress = to;
|
||
|
x509Requirement.Via = via;
|
||
|
x509Requirement.KeyUsage = SecurityKeyUsage.Signature;
|
||
|
x509Requirement.TransportScheme = this.Scheme;
|
||
|
return this.SecurityTokenManager.CreateSecurityTokenProvider(x509Requirement);
|
||
|
}
|
||
|
|
||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||
|
internal SecurityTokenProviderContainer CreateX509TokenProvider(EndpointAddress to, Uri via)
|
||
|
{
|
||
|
if (MsmqAuthenticationMode.Certificate == this.MsmqTransportSecurity.MsmqAuthenticationMode && this.SecurityTokenManager != null)
|
||
|
{
|
||
|
return new SecurityTokenProviderContainer(CreateTokenProvider(to, via));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
|
||
|
{
|
||
|
return new CompletedAsyncResult(callback, state);
|
||
|
}
|
||
|
|
||
|
protected override void OnEndOpen(IAsyncResult result)
|
||
|
{
|
||
|
CompletedAsyncResult.End(result);
|
||
|
}
|
||
|
|
||
|
protected override void OnOpen(TimeSpan timeout)
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
}
|