| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Security
- {
- using System;
- using System.ServiceModel;
- using System.ServiceModel.Description;
- using System.Collections;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Diagnostics;
- using System.Globalization;
- using System.IO;
- using System.Text;
- using System.Threading;
- using System.Xml;
- using System.IdentityModel.Claims;
- using System.IdentityModel.Policy;
- using System.IdentityModel.Tokens;
- using System.Security.Cryptography.X509Certificates;
- using System.ServiceModel.Security.Tokens;
- using HexBinary = System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary;
- using System.ServiceModel.Channels;
- using System.ServiceModel.Security;
- using System.Runtime.Serialization;
- using System.ServiceModel.Dispatcher;
- using KeyIdentifierEntry = WSSecurityTokenSerializer.KeyIdentifierEntry;
- using KeyIdentifierClauseEntry = WSSecurityTokenSerializer.KeyIdentifierClauseEntry;
- using TokenEntry = WSSecurityTokenSerializer.TokenEntry;
- using StrEntry = WSSecurityTokenSerializer.StrEntry;
- class WSTrustFeb2005 : WSTrust
- {
- public WSTrustFeb2005(WSSecurityTokenSerializer tokenSerializer)
- : base(tokenSerializer)
- {
- }
- public override TrustDictionary SerializerDictionary
- {
- get { return XD.TrustFeb2005Dictionary; }
- }
- public class DriverFeb2005 : Driver
- {
- public DriverFeb2005(SecurityStandardsManager standardsManager)
- : base(standardsManager)
- {
- }
- public override TrustDictionary DriverDictionary
- {
- get
- {
- return XD.TrustFeb2005Dictionary;
- }
- }
- public override XmlDictionaryString RequestSecurityTokenResponseFinalAction
- {
- get
- {
- return XD.TrustFeb2005Dictionary.RequestSecurityTokenIssuanceResponse;
- }
- }
- public override bool IsSessionSupported
- {
- get
- {
- return true;
- }
- }
- public override bool IsIssuedTokensSupported
- {
- get
- {
- return true;
- }
- }
- public override string IssuedTokensHeaderName
- {
- get
- {
- return this.DriverDictionary.IssuedTokensHeader.Value;
- }
- }
- public override string IssuedTokensHeaderNamespace
- {
- get
- {
- return this.DriverDictionary.Namespace.Value;
- }
- }
- public override string RequestTypeRenew
- {
- get
- {
- return this.DriverDictionary.RequestTypeRenew.Value;
- }
- }
- public override string RequestTypeClose
- {
- get
- {
- return this.DriverDictionary.RequestTypeClose.Value;
- }
- }
- public override Collection<XmlElement> ProcessUnknownRequestParameters(Collection<XmlElement> unknownRequestParameters, Collection<XmlElement> originalRequestParameters)
- {
- return unknownRequestParameters;
- }
- protected override void ReadReferences(XmlElement rstrXml, out SecurityKeyIdentifierClause requestedAttachedReference,
- out SecurityKeyIdentifierClause requestedUnattachedReference)
- {
- XmlElement issuedTokenXml = null;
- requestedAttachedReference = null;
- requestedUnattachedReference = null;
- for (int i = 0; i < rstrXml.ChildNodes.Count; ++i)
- {
- XmlElement child = rstrXml.ChildNodes[i] as XmlElement;
- if (child != null)
- {
- if (child.LocalName == this.DriverDictionary.RequestedSecurityToken.Value && child.NamespaceURI == this.DriverDictionary.Namespace.Value)
- {
- issuedTokenXml = XmlHelper.GetChildElement(child);
- }
- else if (child.LocalName == this.DriverDictionary.RequestedAttachedReference.Value && child.NamespaceURI == this.DriverDictionary.Namespace.Value)
- {
- requestedAttachedReference = GetKeyIdentifierXmlReferenceClause(XmlHelper.GetChildElement(child));
- }
- else if (child.LocalName == this.DriverDictionary.RequestedUnattachedReference.Value && child.NamespaceURI == this.DriverDictionary.Namespace.Value)
- {
- requestedUnattachedReference = GetKeyIdentifierXmlReferenceClause(XmlHelper.GetChildElement(child));
- }
- }
- }
- try
- {
- if (issuedTokenXml != null)
- {
- if (requestedAttachedReference == null)
- {
- this.StandardsManager.TryCreateKeyIdentifierClauseFromTokenXml(issuedTokenXml, SecurityTokenReferenceStyle.Internal, out requestedAttachedReference);
- }
- if (requestedUnattachedReference == null)
- {
- this.StandardsManager.TryCreateKeyIdentifierClauseFromTokenXml(issuedTokenXml, SecurityTokenReferenceStyle.External, out requestedUnattachedReference);
- }
- }
- }
- catch (XmlException)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.GetString(SR.TrustDriverIsUnableToCreatedNecessaryAttachedOrUnattachedReferences, issuedTokenXml.ToString())));
- }
- }
- protected override bool ReadRequestedTokenClosed(XmlElement rstrXml)
- {
- for (int i = 0; i < rstrXml.ChildNodes.Count; ++i)
- {
- XmlElement child = (rstrXml.ChildNodes[i] as XmlElement);
- if (child != null)
- {
- if (child.LocalName == this.DriverDictionary.RequestedTokenClosed.Value && child.NamespaceURI == this.DriverDictionary.Namespace.Value)
- {
- return true;
- }
- }
- }
- return false;
- }
- protected override void ReadTargets(XmlElement rstXml, out SecurityKeyIdentifierClause renewTarget, out SecurityKeyIdentifierClause closeTarget)
- {
- renewTarget = null;
- closeTarget = null;
- for (int i = 0; i < rstXml.ChildNodes.Count; ++i)
- {
- XmlElement child = (rstXml.ChildNodes[i] as XmlElement);
- if (child != null)
- {
- if (child.LocalName == this.DriverDictionary.RenewTarget.Value && child.NamespaceURI == this.DriverDictionary.Namespace.Value)
- renewTarget = this.StandardsManager.SecurityTokenSerializer.ReadKeyIdentifierClause(new XmlNodeReader(child.FirstChild));
- else if (child.LocalName == this.DriverDictionary.CloseTarget.Value && child.NamespaceURI == this.DriverDictionary.Namespace.Value)
- closeTarget = this.StandardsManager.SecurityTokenSerializer.ReadKeyIdentifierClause(new XmlNodeReader(child.FirstChild));
- }
- }
- }
- protected override void WriteReferences(RequestSecurityTokenResponse rstr, XmlDictionaryWriter writer)
- {
- if (rstr.RequestedAttachedReference != null)
- {
- writer.WriteStartElement(this.DriverDictionary.Prefix.Value, this.DriverDictionary.RequestedAttachedReference, this.DriverDictionary.Namespace);
- this.StandardsManager.SecurityTokenSerializer.WriteKeyIdentifierClause(writer, rstr.RequestedAttachedReference);
- writer.WriteEndElement();
- }
- if (rstr.RequestedUnattachedReference != null)
- {
- writer.WriteStartElement(this.DriverDictionary.Prefix.Value, this.DriverDictionary.RequestedUnattachedReference, this.DriverDictionary.Namespace);
- this.StandardsManager.SecurityTokenSerializer.WriteKeyIdentifierClause(writer, rstr.RequestedUnattachedReference);
- writer.WriteEndElement();
- }
- }
- protected override void WriteRequestedTokenClosed(RequestSecurityTokenResponse rstr, XmlDictionaryWriter writer)
- {
- if (rstr.IsRequestedTokenClosed)
- {
- writer.WriteElementString(this.DriverDictionary.RequestedTokenClosed, this.DriverDictionary.Namespace, String.Empty);
- }
- }
- protected override void WriteTargets(RequestSecurityToken rst, XmlDictionaryWriter writer)
- {
- if (rst.RenewTarget != null)
- {
- writer.WriteStartElement(this.DriverDictionary.Prefix.Value, this.DriverDictionary.RenewTarget, this.DriverDictionary.Namespace);
- this.StandardsManager.SecurityTokenSerializer.WriteKeyIdentifierClause(writer, rst.RenewTarget);
- writer.WriteEndElement();
- }
- if (rst.CloseTarget != null)
- {
- writer.WriteStartElement(this.DriverDictionary.Prefix.Value, this.DriverDictionary.CloseTarget, this.DriverDictionary.Namespace);
- this.StandardsManager.SecurityTokenSerializer.WriteKeyIdentifierClause(writer, rst.CloseTarget);
- writer.WriteEndElement();
- }
- }
- // this is now the abstract in WSTrust
- public override IChannelFactory<IRequestChannel> CreateFederationProxy(EndpointAddress address, Binding binding, KeyedByTypeCollection<IEndpointBehavior> channelBehaviors)
- {
- if (channelBehaviors == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("channelBehaviors");
- ChannelFactory<IWsTrustFeb2005SecurityTokenService> result = new ChannelFactory<IWsTrustFeb2005SecurityTokenService>(binding, address);
- SetProtectionLevelForFederation(result.Endpoint.Contract.Operations);
- // remove the default client credentials that gets added to channel factories
- result.Endpoint.Behaviors.Remove<ClientCredentials>();
- for (int i = 0; i < channelBehaviors.Count; ++i)
- {
- result.Endpoint.Behaviors.Add(channelBehaviors[i]);
- }
- // add a behavior that removes the UI channel initializer added by the client credentials since there should be no UI
- // initializer popped up as part of obtaining the federation token (the UI should already have been popped up for the main channel)
- result.Endpoint.Behaviors.Add(new InteractiveInitializersRemovingBehavior());
- return new RequestChannelFactory<IWsTrustFeb2005SecurityTokenService>(result);
- }
- [ServiceContract]
- internal interface IWsTrustFeb2005SecurityTokenService
- {
- [OperationContract(IsOneWay = false,
- Action = TrustFeb2005Strings.RequestSecurityTokenIssuance,
- ReplyAction = TrustFeb2005Strings.RequestSecurityTokenIssuanceResponse)]
- [FaultContract(typeof(string), Action = "*", ProtectionLevel = System.Net.Security.ProtectionLevel.Sign)]
- Message RequestToken(Message message);
- }
- public class InteractiveInitializersRemovingBehavior : IEndpointBehavior
- {
- public void Validate(ServiceEndpoint serviceEndpoint) { }
- public void AddBindingParameters(ServiceEndpoint serviceEndpoint, BindingParameterCollection bindingParameters) { }
- public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, EndpointDispatcher endpointDispatcher) { }
- public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior)
- {
- // it is very unlikely that InteractiveChannelInitializers will be null, this is defensive in case ClientRuntime every has a
- // bug. I am OK with this as ApplyingClientBehavior is a one-time channel setup.
- if (behavior != null && behavior.InteractiveChannelInitializers != null)
- {
- // clear away any interactive initializer
- behavior.InteractiveChannelInitializers.Clear();
- }
- }
- }
- public class RequestChannelFactory<TokenService> : ChannelFactoryBase, IChannelFactory<IRequestChannel>
- {
- ChannelFactory<TokenService> innerChannelFactory;
- public RequestChannelFactory(ChannelFactory<TokenService> innerChannelFactory)
- {
- this.innerChannelFactory = innerChannelFactory;
- }
- public IRequestChannel CreateChannel(EndpointAddress address)
- {
- return this.innerChannelFactory.CreateChannel<IRequestChannel>(address);
- }
- public IRequestChannel CreateChannel(EndpointAddress address, Uri via)
- {
- return this.innerChannelFactory.CreateChannel<IRequestChannel>(address, via);
- }
- protected override void OnAbort()
- {
- this.innerChannelFactory.Abort();
- }
- protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
- {
- return this.innerChannelFactory.BeginOpen(timeout, callback, state);
- }
- protected override void OnEndOpen(IAsyncResult result)
- {
- this.innerChannelFactory.EndOpen(result);
- }
- protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)
- {
- return this.innerChannelFactory.BeginClose(timeout, callback, state);
- }
- protected override void OnEndClose(IAsyncResult result)
- {
- this.innerChannelFactory.EndClose(result);
- }
- protected override void OnClose(TimeSpan timeout)
- {
- this.innerChannelFactory.Close(timeout);
- }
- protected override void OnOpen(TimeSpan timeout)
- {
- this.innerChannelFactory.Open(timeout);
- }
- public override T GetProperty<T>()
- {
- return this.innerChannelFactory.GetProperty<T>();
- }
- }
- }
- }
- }
|