| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Security
- {
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IdentityModel;
- using System.IdentityModel.Configuration;
- using System.IdentityModel.Diagnostics;
- using System.IdentityModel.Protocols.WSTrust;
- using System.IdentityModel.Selectors;
- using System.IdentityModel.Tokens;
- using System.IO;
- using System.Security.Claims;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Channels;
- using System.ServiceModel.Description;
- using System.Threading;
- using System.Web.Services.Description;
- using System.Xml;
- using System.Xml.Schema;
- using DiagnosticUtility = System.IdentityModel.DiagnosticUtility;
- using Message = System.ServiceModel.Channels.Message;
- using RequestContext = System.ServiceModel.Channels.RequestContext;
- using RST = System.IdentityModel.Protocols.WSTrust.RequestSecurityToken;
- using RSTR = System.IdentityModel.Protocols.WSTrust.RequestSecurityTokenResponse;
- using SR = System.ServiceModel.SR;
- using STS = System.IdentityModel.SecurityTokenService;
- using Fx = System.Runtime.Fx;
- /// <summary>
- /// Definition of Trust Contract Implementation. Implements the following ServiceContract interfaces,
- /// 1. IWSTrustFeb2005SyncContract
- /// 2. IWSTrust13SyncContract
- /// 3. IWSTrustFeb2005AsyncContract
- /// 4. IWSTrust13AsyncContract
- /// </summary>
- [ServiceBehavior(Name = WSTrustServiceContractConstants.ServiceBehaviorName, Namespace = WSTrustServiceContractConstants.Namespace, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class WSTrustServiceContract : IWSTrustFeb2005SyncContract, IWSTrust13SyncContract, IWSTrustFeb2005AsyncContract, IWSTrust13AsyncContract, IWsdlExportExtension, IContractBehavior
- {
- const string soap11Namespace = "http://schemas.xmlsoap.org/soap/envelope/";
- const string soap12Namespace = "http://www.w3.org/2003/05/soap-envelope";
- SecurityTokenServiceConfiguration _securityTokenServiceConfiguration;
- event EventHandler<WSTrustRequestProcessingErrorEventArgs> _requestFailed;
- /// <summary>
- /// Initializes an instance of <see cref="WSTrustServiceContract"/>
- /// </summary>
- /// <param name="securityTokenServiceConfiguration">Configuration object that initializes this instance.</param>
- public WSTrustServiceContract(SecurityTokenServiceConfiguration securityTokenServiceConfiguration)
- {
- if (securityTokenServiceConfiguration == null)
- {
- throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("securityTokenServiceConfiguration");
- }
- _securityTokenServiceConfiguration = securityTokenServiceConfiguration;
- }
- /// <summary>
- /// Occurs when a Failure happens processing a Trust request from the
- /// client.
- /// </summary>
- public event EventHandler<WSTrustRequestProcessingErrorEventArgs> RequestFailed
- {
- add { _requestFailed += value; }
- remove { _requestFailed -= value; }
- }
- /// <summary>
- /// Returns the <see cref="SecurityTokenResolver" /> that resolves the following security tokens contained
- /// in the current WCF message request's security header: protection token, endorsing, or signed endorsing
- /// supporting tokens.
- /// </summary>
- /// <remarks>
- /// This <see cref="SecurityTokenResolver" /> is used to resolve any SecurityTokenIdentifiers
- /// when deserializing RST UseKey elements or RST RenewTarget elements.
- /// </remarks>
- /// <exception cref="ArgumentNullException"><param name="requestContext"/> is null.</exception>
- protected virtual SecurityTokenResolver GetSecurityHeaderTokenResolver(RequestContext requestContext)
- {
- if (requestContext == null)
- {
- throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("requestContext");
- }
- List<SecurityToken> tokenList = new List<SecurityToken>();
- if (requestContext.RequestMessage != null
- && requestContext.RequestMessage.Properties != null
- && requestContext.RequestMessage.Properties.Security != null)
- {
- // Add tokens in message
- SecurityMessageProperty msgProperty = requestContext.RequestMessage.Properties.Security;
- if (msgProperty.ProtectionToken != null)
- {
- tokenList.Add(msgProperty.ProtectionToken.SecurityToken);
- }
- if (msgProperty.HasIncomingSupportingTokens)
- {
- foreach (SupportingTokenSpecification tokenSpec in msgProperty.IncomingSupportingTokens)
- {
- if (tokenSpec != null &&
- (tokenSpec.SecurityTokenAttachmentMode == SecurityTokenAttachmentMode.Endorsing ||
- tokenSpec.SecurityTokenAttachmentMode == SecurityTokenAttachmentMode.SignedEndorsing))
- {
- tokenList.Add(tokenSpec.SecurityToken);
- }
- }
- }
- if (msgProperty.InitiatorToken != null)
- {
- tokenList.Add(msgProperty.InitiatorToken.SecurityToken);
- }
- }
- if (tokenList.Count > 0)
- {
- return SecurityTokenResolver.CreateDefaultSecurityTokenResolver(tokenList.AsReadOnly(), true);
- }
- else
- {
- return EmptySecurityTokenResolver.Instance;
- }
- }
- /// <summary>
- /// Returns the <see cref="SecurityTokenResolver" /> that will be used when resolving tokens and keys in the
- /// Trust message body.
- /// </summary>
- /// <returns>A <see cref="SecurityTokenResolver" /> instance.</returns>
- /// <seealso cref="GetSecurityHeaderTokenResolver"/>
- protected virtual SecurityTokenResolver GetRstSecurityTokenResolver()
- {
- if (_securityTokenServiceConfiguration != null)
- {
- SecurityTokenResolver tokenResolver = _securityTokenServiceConfiguration.SecurityTokenHandlers.Configuration.ServiceTokenResolver;
- if (tokenResolver != null && (!Object.ReferenceEquals(tokenResolver, EmptySecurityTokenResolver.Instance)))
- {
- return tokenResolver;
- }
- }
- if (OperationContext.Current != null && OperationContext.Current.Host != null &&
- OperationContext.Current.Host.Description != null)
- {
- ServiceCredentials serviceCreds = OperationContext.Current.Host.Description.Behaviors.Find<ServiceCredentials>();
- if (serviceCreds != null && serviceCreds.ServiceCertificate != null && serviceCreds.ServiceCertificate.Certificate != null)
- {
- List<SecurityToken> serviceTokens = new List<SecurityToken>(1);
- serviceTokens.Add(new X509SecurityToken(serviceCreds.ServiceCertificate.Certificate));
- return SecurityTokenResolver.CreateDefaultSecurityTokenResolver(serviceTokens.AsReadOnly(), false);
- }
- }
- return EmptySecurityTokenResolver.Instance;
- }
- /// <summary>
- /// Creates a WSTrustSerializationContext using the local resolver information
- /// of the WSTrustServiceClient.
- /// </summary>
- /// <returns>A WSTrustSerializationContext initialized with the current resolver information.</returns>
- protected virtual WSTrustSerializationContext CreateSerializationContext()
- {
- return new WSTrustSerializationContext(_securityTokenServiceConfiguration.SecurityTokenHandlerCollectionManager,
- this.GetRstSecurityTokenResolver(),
- this.GetSecurityHeaderTokenResolver(OperationContext.Current.RequestContext)
- );
- }
- /// <summary>
- /// Begins an asynchronous call to <see cref="DispatchRequest"/>.
- /// </summary>
- /// <param name="dispatchContext">Defines the request parameters to process and exposes properties
- /// that determine the response message and action.</param>
- /// <param name="asyncCallback">An optional asynchronous callback, to be called when the
- /// dispatch is complete.</param>
- /// <param name="asyncState">A user-provided object that distinguishes this particular asynchronous
- /// dispatch request from other requests.</param>
- /// <returns><see cref="IAsyncResult"/> that represents the asynchronous operation. Used as the input
- /// to <see cref="EndDispatchRequest"/>.</returns>
- protected virtual IAsyncResult BeginDispatchRequest(DispatchContext dispatchContext, AsyncCallback asyncCallback, object asyncState)
- {
- return new DispatchRequestAsyncResult(dispatchContext, asyncCallback, asyncState);
- }
- /// <summary>
- /// Completes an asynchronous call to <see cref="DispatchRequest"/>.
- /// </summary>
- /// <param name="ar"><see cref="IAsyncResult"/> that was returned by the
- /// call to <see cref="BeginDispatchRequest"/>.</param>
- /// <returns>The <see cref="DispatchContext"/> that exposes properties which determine the response
- /// message and action.</returns>
- protected virtual DispatchContext EndDispatchRequest(IAsyncResult ar)
- {
- return DispatchRequestAsyncResult.End(ar);
- }
- /// <summary>
- /// Processes a WS-Trust request message, and optionally determines the appropriate
- /// response message and the WS-Addressing action for the response message.
- /// </summary>
- /// <param name="dispatchContext">Defines the request parameters to process and exposes properties
- /// that determine the response message and action.</param>
- protected virtual void DispatchRequest(DispatchContext dispatchContext)
- {
- RST rst = dispatchContext.RequestMessage as RST;
- STS sts = dispatchContext.SecurityTokenService;
- ClaimsPrincipal icp = dispatchContext.Principal;
- if (rst != null)
- {
- switch (rst.RequestType)
- {
- case RequestTypes.Cancel:
- dispatchContext.ResponseMessage = sts.Cancel(icp, rst);
- break;
- case RequestTypes.Issue:
- dispatchContext.ResponseMessage = sts.Issue(icp, rst);
- break;
- case RequestTypes.Renew:
- dispatchContext.ResponseMessage = sts.Renew(icp, rst);
- break;
- case RequestTypes.Validate:
- dispatchContext.ResponseMessage = sts.Validate(icp, rst);
- break;
- default:
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ID3112, rst.RequestType)));
- }
- }
- else
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidRequestException(SR.GetString(SR.ID3022)));
- }
- }
- /// <summary>
- /// Handles Synchronous calls to the STS.
- /// </summary>
- /// <param name="requestMessage">Incoming Request message.</param>
- /// <param name="requestSerializer">Trust Request Serializer.</param>
- /// <param name="responseSerializer">Trust Response Serializer.</param>
- /// <param name="requestAction">Request SOAP action.</param>
- /// <param name="responseAction">Response SOAP action.</param>
- /// <param name="trustNamespace">Namespace URI of the trust version of the incoming request.</param>
- /// <returns>Response message that contains the serialized RSTR.</returns>
- /// <exception cref="ArgumentNullException">One of the argument is null.</exception>
- protected virtual Message ProcessCore(Message requestMessage, WSTrustRequestSerializer requestSerializer, WSTrustResponseSerializer responseSerializer, string requestAction, string responseAction, string trustNamespace)
- {
- if (requestMessage == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("requestMessage");
- }
- if (requestSerializer == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("requestSerializer");
- }
- if (responseSerializer == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("responseSerializer");
- }
- if (String.IsNullOrEmpty(requestAction))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("requestAction");
- }
- if (String.IsNullOrEmpty(responseAction))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("responseAction");
- }
- if (String.IsNullOrEmpty(trustNamespace))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("trustNamespace");
- }
- Message response = null;
- try
- {
- Fx.Assert(OperationContext.Current != null, "");
- Fx.Assert(OperationContext.Current.RequestContext != null, "");
- //
- // Create the Serialization and Dispatch context objects.
- //
- WSTrustSerializationContext serializationContext = CreateSerializationContext();
- DispatchContext dispatchContext = CreateDispatchContext(requestMessage,
- requestAction,
- responseAction,
- trustNamespace,
- requestSerializer,
- responseSerializer,
- serializationContext);
- //
- // Validate the dispatch context.
- //
- ValidateDispatchContext(dispatchContext);
- //
- // Dispatch the STS message.
- //
- DispatchRequest(dispatchContext);
- //
- // Create the response Message object with the appropriate action.
- //
- response = Message.CreateMessage(OperationContext.Current.RequestContext.RequestMessage.Version,
- dispatchContext.ResponseAction,
- new WSTrustResponseBodyWriter(dispatchContext.ResponseMessage, responseSerializer, serializationContext));
- }
- catch (Exception ex)
- {
- if (!HandleException(ex, trustNamespace, requestAction, requestMessage.Version.Envelope))
- {
- throw;
- }
- }
- return response;
- }
- /// <summary>
- /// Creates a <see cref="DispatchContext"/> object for use by the <see cref="DispatchRequest"/> method.
- /// </summary>
- /// <param name="requestMessage">The incoming request message.</param>
- /// <param name="requestAction">The SOAP action of the request.</param>
- /// <param name="responseAction">The default SOAP action of the response.</param>
- /// <param name="trustNamespace">Namespace URI of the trust version of the incoming request.</param>
- /// <param name="requestSerializer">The <see cref="WSTrustRequestSerializer"/> used to deserialize
- /// incoming RST messages.</param>
- /// <param name="responseSerializer">The <see cref="WSTrustResponseSerializer"/> used to deserialize
- /// incoming RSTR messages.</param>
- /// <param name="serializationContext">The <see cref="WSTrustSerializationContext"/> to use
- /// when deserializing incoming messages.</param>
- /// <returns>A <see cref="DispatchContext"/> object.</returns>
- protected virtual DispatchContext CreateDispatchContext(Message requestMessage,
- string requestAction,
- string responseAction,
- string trustNamespace,
- WSTrustRequestSerializer requestSerializer,
- WSTrustResponseSerializer responseSerializer,
- WSTrustSerializationContext serializationContext)
- {
- DispatchContext dispatchContext = new DispatchContext()
- {
- Principal = OperationContext.Current.ClaimsPrincipal as ClaimsPrincipal,
- RequestAction = requestAction,
- ResponseAction = responseAction,
- TrustNamespace = trustNamespace
- };
- XmlReader requestBodyReader = requestMessage.GetReaderAtBodyContents();
- //
- // Take a peek at the request with the serializers to figure out if this is a standard incoming
- // RST or if this is an instance of a challenge-response style message pattern where an RSTR comes in.
- //
- if (requestSerializer.CanRead(requestBodyReader))
- {
- dispatchContext.RequestMessage = requestSerializer.ReadXml(requestBodyReader, serializationContext);
- }
- else if (responseSerializer.CanRead(requestBodyReader))
- {
- dispatchContext.RequestMessage = responseSerializer.ReadXml(requestBodyReader, serializationContext);
- }
- else
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new InvalidRequestException(SR.GetString(SR.ID3114)));
- }
- //
- // CAUTION: Don't create the STS until after the RST or RSTR is deserialized or the test team
- // has major infrastructure problems.
- //
- dispatchContext.SecurityTokenService = CreateSTS();
- return dispatchContext;
- }
- /// <summary>
- /// Validates the DispatchContext.
- /// </summary>
- /// <param name="dispatchContext">The <see cref="DispatchContext"/> to validate.</param>
- /// <remarks>
- /// This routine ensures that the <see cref="DispatchContext"/> represents a legal request
- /// prior to being passed into <see cref="DispatchRequest"/>. This routine's default implementation
- /// is to reject incoming RST messages with RSTR actions and vice versa.
- /// </remarks>
- protected virtual void ValidateDispatchContext(DispatchContext dispatchContext)
- {
- if (dispatchContext.RequestMessage is RST
- && !IsValidRSTAction(dispatchContext))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new InvalidRequestException(
- SR.GetString(SR.ID3113, "RequestSecurityToken", dispatchContext.RequestAction)));
- }
- if (dispatchContext.RequestMessage is RSTR
- && !IsValidRSTRAction(dispatchContext))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new InvalidRequestException(
- SR.GetString(SR.ID3113, "RequestSecurityTokenResponse", dispatchContext.RequestAction)));
- }
- }
- /// <summary>
- /// Determines if the DispatchContext contains a valid request action for incoming RST messages.
- /// </summary>
- private static bool IsValidRSTAction(DispatchContext dispatchContext)
- {
- bool valid = false;
- string action = dispatchContext.RequestAction;
- if (dispatchContext.TrustNamespace == WSTrust13Constants.NamespaceURI)
- {
- switch (action)
- {
- case WSTrust13Constants.Actions.Cancel:
- case WSTrust13Constants.Actions.Issue:
- case WSTrust13Constants.Actions.Renew:
- case WSTrust13Constants.Actions.Validate:
- valid = true;
- break;
- }
- }
- if (dispatchContext.TrustNamespace == WSTrustFeb2005Constants.NamespaceURI)
- {
- switch (action)
- {
- case WSTrustFeb2005Constants.Actions.Cancel:
- case WSTrustFeb2005Constants.Actions.Issue:
- case WSTrustFeb2005Constants.Actions.Renew:
- case WSTrustFeb2005Constants.Actions.Validate:
- valid = true;
- break;
- }
- }
- return valid;
- }
- /// <summary>
- /// Determines if the DispatchContext contains a valid request action for incoming RSTR messages.
- /// </summary>
- private static bool IsValidRSTRAction(DispatchContext dispatchContext)
- {
- bool valid = false;
- string action = dispatchContext.RequestAction;
- if (dispatchContext.TrustNamespace == WSTrust13Constants.NamespaceURI)
- {
- switch (action)
- {
- case WSTrust13Constants.Actions.CancelFinalResponse:
- case WSTrust13Constants.Actions.CancelResponse:
- case WSTrust13Constants.Actions.IssueFinalResponse:
- case WSTrust13Constants.Actions.IssueResponse:
- case WSTrust13Constants.Actions.RenewFinalResponse:
- case WSTrust13Constants.Actions.RenewResponse:
- case WSTrust13Constants.Actions.ValidateFinalResponse:
- case WSTrust13Constants.Actions.ValidateResponse:
- valid = true;
- break;
- }
- }
- if (dispatchContext.TrustNamespace == WSTrustFeb2005Constants.NamespaceURI)
- {
- switch (action)
- {
- case WSTrustFeb2005Constants.Actions.CancelResponse:
- case WSTrustFeb2005Constants.Actions.IssueResponse:
- case WSTrustFeb2005Constants.Actions.RenewResponse:
- case WSTrustFeb2005Constants.Actions.ValidateResponse:
- valid = true;
- break;
- }
- }
- return valid;
- }
- private STS CreateSTS()
- {
- STS sts = _securityTokenServiceConfiguration.CreateSecurityTokenService();
- if (sts == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ID3002)));
- }
- return sts;
- }
- /// <summary>
- /// Handles Asynchronous call to the STS.
- /// </summary>
- /// <param name="requestMessage">Incoming Request message.</param>
- /// <param name="requestSerializer">Trust Request Serializer.</param>
- /// <param name="responseSerializer">Trust Response Serializer.</param>
- /// <param name="requestAction">Request SOAP action.</param>
- /// <param name="responseAction">Response SOAP action.</param>
- /// <param name="trustNamespace">Namespace URI of the trust version of the incoming request.</param>
- /// <param name="callback">Callback that gets invoked when the Asynchronous call ends.</param>
- /// <param name="state">state information of the Asynchronous call.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- /// <exception cref="ArgumentNullException">One of the argument is null.</exception>
- protected virtual IAsyncResult BeginProcessCore(Message requestMessage, WSTrustRequestSerializer requestSerializer, WSTrustResponseSerializer responseSerializer, string requestAction, string responseAction, string trustNamespace, AsyncCallback callback, object state)
- {
- if (requestMessage == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("request");
- }
- if (requestSerializer == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("requestSerializer");
- }
- if (responseSerializer == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("responseSerializer");
- }
- if (String.IsNullOrEmpty(requestAction))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("requestAction");
- }
- if (String.IsNullOrEmpty(responseAction))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("responseAction");
- }
- if (String.IsNullOrEmpty(trustNamespace))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("trustNamespace");
- }
- IAsyncResult result = null;
- try
- {
- Fx.Assert(OperationContext.Current != null, "");
- Fx.Assert(OperationContext.Current.RequestContext != null, "");
- //
- // Create the Serialization and Dispatch context objects.
- //
- WSTrustSerializationContext serializationContext = CreateSerializationContext();
- DispatchContext dispatchContext = CreateDispatchContext(requestMessage,
- requestAction,
- responseAction,
- trustNamespace,
- requestSerializer,
- responseSerializer,
- serializationContext);
- //
- // Validate the dispatch context.
- //
- ValidateDispatchContext(dispatchContext);
- //
- // Dispatch the message asynchronously.
- //
- result = new ProcessCoreAsyncResult(this,
- dispatchContext,
- OperationContext.Current.RequestContext.RequestMessage.Version,
- responseSerializer,
- serializationContext,
- callback,
- state);
- }
- catch (Exception ex)
- {
- if (!HandleException(ex, trustNamespace, requestAction, requestMessage.Version.Envelope))
- {
- throw;
- }
- }
- return result;
- }
- /// <summary>
- /// Completes an Asynchronous call to the STS.
- /// </summary>
- /// <param name="ar">IAsyncResult that was returned by the call to the Asynchronous Begin method.</param>
- /// <param name="requestAction">Request SOAP Action.</param>
- /// <param name="responseAction">Response SOAP Action.</param>
- /// <param name="trustNamespace">Namespace URI of the current trust version.</param>
- /// <returns>Message that contains the serialized RST message.</returns>
- /// <exception cref="ArgumentNullException">One of the argument is null.</exception>
- protected virtual Message EndProcessCore(IAsyncResult ar, string requestAction, string responseAction, string trustNamespace)
- {
- if (ar == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("ar");
- }
- ProcessCoreAsyncResult asyncResult = ar as ProcessCoreAsyncResult;
- if (asyncResult == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.ID2004, typeof(ProcessCoreAsyncResult), ar.GetType()), "ar"));
- }
- Message message = null;
- try
- {
- message = ProcessCoreAsyncResult.End(ar);
- }
- catch (Exception ex)
- {
- if (!HandleException(ex, trustNamespace, requestAction, asyncResult.MessageVersion.Envelope))
- {
- throw;
- }
- }
- return message;
- }
- /// <summary>
- /// Raises the Error Event and converts the given exception to a FaultException if required. If the original
- /// exception was a FaultException or PreserveOriginalException flag is set to true then the conversion to
- /// FaultException is not done.
- /// </summary>
- /// <param name="ex">The original exception.</param>
- /// <param name="trustNamespace">Trust Namespace of the current trust version.</param>
- /// <param name="action">The Trust action that caused the exception.</param>
- /// <param name="requestEnvelopeVersion">Version of the request envolope.</param>
- protected virtual bool HandleException(Exception ex, string trustNamespace, string action, EnvelopeVersion requestEnvelopeVersion)
- {
- if (System.Runtime.Fx.IsFatal(ex))
- {
- return false;
- }
- if (DiagnosticUtility.ShouldTrace(TraceEventType.Warning))
- {
- TraceUtility.TraceString(
- TraceEventType.Warning,
- "RequestFailed: TrustNamespace={0}, Action={1}, Exception={2}",
- trustNamespace,
- action,
- ex);
- }
- // raise the exception events.
- if (_requestFailed != null)
- {
- _requestFailed(this, new WSTrustRequestProcessingErrorEventArgs(action, ex));
- }
- bool preserveOriginalException = false;
- ServiceDebugBehavior debugBehavior = OperationContext.Current.Host.Description.Behaviors.Find<ServiceDebugBehavior>();
- if (debugBehavior != null)
- {
- preserveOriginalException = debugBehavior.IncludeExceptionDetailInFaults;
- }
- if (String.IsNullOrEmpty(trustNamespace) || String.IsNullOrEmpty(action) || preserveOriginalException || ex is FaultException)
- {
- // Just throw the original exception.
- return false;
- }
- else
- {
- FaultException faultException = OperationContext.Current.Host.Credentials.ExceptionMapper.FromException(ex, (requestEnvelopeVersion == EnvelopeVersion.Soap11) ? soap11Namespace : soap12Namespace, trustNamespace);
- if (faultException != null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(faultException);
- }
- // The exception is not one of the recognized exceptions. Just throw the original exception.
- return false;
- }
- }
- #region IWSTrustFeb2005SyncContract and IWSTrust13SyncContract Methods
- /// <summary>
- /// Processes a Trust 1.3 Cancel message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13Cancel(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Cancel, WSTrust13Constants.Actions.CancelFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust 1.3 Issue message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13Issue(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Issue, WSTrust13Constants.Actions.IssueFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust 1.3 Renew message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13Renew(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Renew, WSTrust13Constants.Actions.RenewFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust 1.3 Validate message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13Validate(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Validate, WSTrust13Constants.Actions.ValidateFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust 1.3 RSTR/Cancel message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13CancelResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.CancelResponse,
- WSTrust13Constants.Actions.CancelFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust 1.3 RSTR/Issue message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13IssueResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.IssueResponse,
- WSTrust13Constants.Actions.IssueFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust 1.3 RSTR/Renew message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13RenewResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.RenewResponse,
- WSTrust13Constants.Actions.RenewFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust 1.3 RSTR/Validate message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrust13ValidateResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.ValidateResponse,
- WSTrust13Constants.Actions.ValidateFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 Cancel message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005Cancel(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Cancel, WSTrustFeb2005Constants.Actions.CancelResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 Issue message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005Issue(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Issue, WSTrustFeb2005Constants.Actions.IssueResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 Renew message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005Renew(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Renew, WSTrustFeb2005Constants.Actions.RenewResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 Validate message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005Validate(Message message)
- {
- return ProcessCore(message, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Validate, WSTrustFeb2005Constants.Actions.ValidateResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 RSTR/Cancel message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005CancelResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.CancelResponse,
- WSTrustFeb2005Constants.Actions.CancelResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 RSTR/Issue message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005IssueResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.IssueResponse,
- WSTrustFeb2005Constants.Actions.IssueResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 RSTR/Renew message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005RenewResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.RenewResponse,
- WSTrustFeb2005Constants.Actions.RenewResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes a Trust Feb 2005 RSTR/Validate message synchronously.
- /// </summary>
- /// <param name="message">Incoming Request message.</param>
- /// <returns>Message with the serialized response.</returns>
- public Message ProcessTrustFeb2005ValidateResponse(Message message)
- {
- return ProcessCore(message,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.ValidateResponse,
- WSTrustFeb2005Constants.Actions.ValidateResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Gets the SecurityTokenServiceConfiguration
- /// </summary>
- public SecurityTokenServiceConfiguration SecurityTokenServiceConfiguration
- {
- get
- {
- return _securityTokenServiceConfiguration;
- }
- }
- #endregion
- #region IWSTrustFeb2005AsyncContract and IWSTrust13AsyncContract Methods
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 1.3 Cancel message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13Cancel(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Cancel, WSTrust13Constants.Actions.CancelFinalResponse, WSTrust13Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 Cancel message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13Cancel(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrust13Constants.Actions.Cancel, WSTrust13Constants.Actions.CancelFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 1.3 Issue message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13Issue(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Issue, WSTrust13Constants.Actions.IssueFinalResponse, WSTrust13Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 Issue message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13Issue(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrust13Constants.Actions.Issue, WSTrust13Constants.Actions.IssueFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 1.3 Renew message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13Renew(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Renew, WSTrust13Constants.Actions.RenewFinalResponse, WSTrust13Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 Renew message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13Renew(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrust13Constants.Actions.Renew, WSTrust13Constants.Actions.RenewFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 1.3 Validate message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13Validate(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrust13RequestSerializer, _securityTokenServiceConfiguration.WSTrust13ResponseSerializer, WSTrust13Constants.Actions.Validate, WSTrust13Constants.Actions.ValidateFinalResponse, WSTrust13Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 Validate message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13Validate(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrust13Constants.Actions.Validate, WSTrust13Constants.Actions.ValidateFinalResponse, WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 1.3 RSTR/Cancel message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13CancelResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.CancelResponse,
- WSTrust13Constants.Actions.CancelFinalResponse,
- WSTrust13Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 RSTR/Cancel message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13CancelResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrust13Constants.Actions.CancelResponse,
- WSTrust13Constants.Actions.CancelFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 1.3 RSTR/Issue message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13IssueResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.IssueResponse,
- WSTrust13Constants.Actions.IssueFinalResponse,
- WSTrust13Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 RSTR/Issue message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13IssueResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrust13Constants.Actions.IssueResponse,
- WSTrust13Constants.Actions.IssueFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 1.3 RSTR/Renew message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13RenewResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.RenewResponse,
- WSTrust13Constants.Actions.RenewFinalResponse,
- WSTrust13Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 RSTR/Renew message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13RenewResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrust13Constants.Actions.RenewResponse,
- WSTrust13Constants.Actions.RenewFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 1.3 RSTR/Validate message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrust13ValidateResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrust13RequestSerializer,
- _securityTokenServiceConfiguration.WSTrust13ResponseSerializer,
- WSTrust13Constants.Actions.ValidateResponse,
- WSTrust13Constants.Actions.ValidateFinalResponse,
- WSTrust13Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust 1.3 RSTR/Validate message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrust13ValidateResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrust13Constants.Actions.ValidateResponse,
- WSTrust13Constants.Actions.ValidateFinalResponse,
- WSTrust13Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust 2005 Cancel message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005Cancel(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Cancel, WSTrustFeb2005Constants.Actions.CancelResponse, WSTrustFeb2005Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 Cancel message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005Cancel(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrustFeb2005Constants.Actions.Cancel, WSTrustFeb2005Constants.Actions.CancelResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 2005 Issue message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005Issue(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Issue, WSTrustFeb2005Constants.Actions.IssueResponse, WSTrustFeb2005Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 Issue message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005Issue(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrustFeb2005Constants.Actions.Issue, WSTrustFeb2005Constants.Actions.IssueResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 2005 Renew message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005Renew(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Renew, WSTrustFeb2005Constants.Actions.RenewResponse, WSTrustFeb2005Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 Renew message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005Renew(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrustFeb2005Constants.Actions.Renew, WSTrustFeb2005Constants.Actions.RenewResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 2005 Validate message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005Validate(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request, _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer, _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer, WSTrustFeb2005Constants.Actions.Validate, WSTrustFeb2005Constants.Actions.ValidateResponse, WSTrustFeb2005Constants.NamespaceURI, callback, state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 Validate message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005Validate(IAsyncResult ar)
- {
- return EndProcessCore(ar, WSTrustFeb2005Constants.Actions.Validate, WSTrustFeb2005Constants.Actions.ValidateResponse, WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 2005 RSTR/Cancel message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005CancelResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.CancelResponse,
- WSTrustFeb2005Constants.Actions.CancelResponse,
- WSTrustFeb2005Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 RSTR/Cancel message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005CancelResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrustFeb2005Constants.Actions.CancelResponse,
- WSTrustFeb2005Constants.Actions.CancelResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 2005 RSTR/Issue message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005IssueResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.IssueResponse,
- WSTrustFeb2005Constants.Actions.IssueResponse,
- WSTrustFeb2005Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 RSTR/Issue message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005IssueResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrustFeb2005Constants.Actions.IssueResponse,
- WSTrustFeb2005Constants.Actions.IssueResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 2005 RSTR/Renew message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005RenewResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.RenewResponse,
- WSTrustFeb2005Constants.Actions.RenewResponse,
- WSTrustFeb2005Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 RSTR/Renew message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005RenewResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrustFeb2005Constants.Actions.RenewResponse,
- WSTrustFeb2005Constants.Actions.RenewResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- /// <summary>
- /// Processes an Asynchronous call to Trust Feb 2005 RSTR/Validate message.
- /// </summary>
- /// <param name="request">Incoming Request message.</param>
- /// <param name="callback">Callback to be invoked when the Asynchronous operation ends.</param>
- /// <param name="state">Asynchronous state.</param>
- /// <returns>IAsyncResult that should be passed back to the End method to complete the Asynchronous call.</returns>
- public IAsyncResult BeginTrustFeb2005ValidateResponse(Message request, AsyncCallback callback, object state)
- {
- return BeginProcessCore(request,
- _securityTokenServiceConfiguration.WSTrustFeb2005RequestSerializer,
- _securityTokenServiceConfiguration.WSTrustFeb2005ResponseSerializer,
- WSTrustFeb2005Constants.Actions.ValidateResponse,
- WSTrustFeb2005Constants.Actions.ValidateResponse,
- WSTrustFeb2005Constants.NamespaceURI,
- callback,
- state);
- }
- /// <summary>
- /// Completes an Asynchronous call to Trust Feb 2005 RSTR/Validate message.
- /// </summary>
- /// <param name="ar">IAsyncResult object returned by the Begin method that started the Asynchronous call.</param>
- /// <returns>Message containing the Serialized RSTR.</returns>
- public Message EndTrustFeb2005ValidateResponse(IAsyncResult ar)
- {
- return EndProcessCore(ar,
- WSTrustFeb2005Constants.Actions.ValidateResponse,
- WSTrustFeb2005Constants.Actions.ValidateResponse,
- WSTrustFeb2005Constants.NamespaceURI);
- }
- #endregion
- //
- // An async result class that represents the async version of the ProcessCore method.
- //
- internal class ProcessCoreAsyncResult : AsyncResult
- {
- //
- // Encapsulate the local variables in the [....] version of ProcessCore as fields.
- //
- WSTrustServiceContract _trustServiceContract;
- DispatchContext _dispatchContext;
- MessageVersion _messageVersion;
- WSTrustResponseSerializer _responseSerializer;
- WSTrustSerializationContext _serializationContext;
- public ProcessCoreAsyncResult(WSTrustServiceContract contract,
- DispatchContext dispatchContext,
- MessageVersion messageVersion,
- WSTrustResponseSerializer responseSerializer,
- WSTrustSerializationContext serializationContext,
- AsyncCallback asyncCallback,
- object asyncState)
- : base(asyncCallback, asyncState)
- {
- if (contract == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("contract");
- }
- if (dispatchContext == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("dispatchContext");
- }
- if (responseSerializer == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("responseSerializer");
- }
- if (serializationContext == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serializationContext");
- }
- _trustServiceContract = contract;
- _dispatchContext = dispatchContext;
- _messageVersion = messageVersion;
- _responseSerializer = responseSerializer;
- _serializationContext = serializationContext;
- contract.BeginDispatchRequest(dispatchContext, OnDispatchRequestCompleted, null);
- }
- public WSTrustServiceContract TrustServiceContract
- {
- get { return _trustServiceContract; }
- }
- public DispatchContext DispatchContext
- {
- get { return _dispatchContext; }
- }
- public MessageVersion MessageVersion
- {
- get { return _messageVersion; }
- }
- public WSTrustResponseSerializer ResponseSerializer
- {
- get { return _responseSerializer; }
- }
- public WSTrustSerializationContext SerializationContext
- {
- get { return _serializationContext; }
- }
- public new static Message End(IAsyncResult ar)
- {
- AsyncResult.End(ar);
- ProcessCoreAsyncResult pcar = ar as ProcessCoreAsyncResult;
- if (pcar == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID2004, typeof(ProcessCoreAsyncResult), ar.GetType()));
- }
- //
- // Create the response Message object with the appropriate action.
- //
- return Message.CreateMessage(OperationContext.Current.RequestContext.RequestMessage.Version,
- pcar.DispatchContext.ResponseAction,
- new WSTrustResponseBodyWriter(pcar.DispatchContext.ResponseMessage,
- pcar.ResponseSerializer,
- pcar.SerializationContext));
- }
- //
- // Asynchronously invoked when WSTrustServiceContract.BeginDispatchRequest completes.
- //
- private void OnDispatchRequestCompleted(IAsyncResult ar)
- {
- try
- {
- _dispatchContext = _trustServiceContract.EndDispatchRequest(ar);
- this.Complete(false);
- }
- catch (Exception ex)
- {
- if (System.Runtime.Fx.IsFatal(ex))
- {
- throw;
- }
- this.Complete(false, ex);
- }
- }
- }
- //
- // AsyncResult to encapsulate the default async implementation of DispatchRequest
- //
- internal class DispatchRequestAsyncResult : AsyncResult
- {
- DispatchContext _dispatchContext;
- public DispatchContext DispatchContext
- {
- get { return _dispatchContext; }
- }
- public DispatchRequestAsyncResult(DispatchContext dispatchContext, AsyncCallback asyncCallback, object asyncState)
- : base(asyncCallback, asyncState)
- {
- _dispatchContext = dispatchContext;
- ClaimsPrincipal icp = dispatchContext.Principal;
- RST rst = dispatchContext.RequestMessage as RST;
- STS sts = dispatchContext.SecurityTokenService;
- if (rst == null)
- {
- this.Complete(true, DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidRequestException(SR.GetString(SR.ID3023))));
- return;
- }
- switch (rst.RequestType)
- {
- case RequestTypes.Cancel:
- sts.BeginCancel(icp, rst, OnCancelComplete, null);
- break;
- case RequestTypes.Issue:
- sts.BeginIssue(icp, rst, OnIssueComplete, null);
- break;
- case RequestTypes.Renew:
- sts.BeginRenew(icp, rst, OnRenewComplete, null);
- break;
- case RequestTypes.Validate:
- sts.BeginValidate(icp, rst, OnValidateComplete, null);
- break;
- default:
- this.Complete(true, DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ID3112, rst.RequestType))));
- break;
- }
- }
- public new static DispatchContext End(IAsyncResult ar)
- {
- AsyncResult.End(ar);
- DispatchRequestAsyncResult dcar = ar as DispatchRequestAsyncResult;
- if (dcar == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID2004, typeof(DispatchRequestAsyncResult), ar.GetType()));
- }
- return dcar.DispatchContext;
- }
- void OnCancelComplete(IAsyncResult ar)
- {
- try
- {
- _dispatchContext.ResponseMessage = _dispatchContext.SecurityTokenService.EndCancel(ar);
- Complete(false);
- }
- catch (Exception e)
- {
- System.ServiceModel.DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- if (Fx.IsFatal(e)) throw;
- Complete(false, e);
- }
- }
- void OnIssueComplete(IAsyncResult ar)
- {
- try
- {
- _dispatchContext.ResponseMessage = _dispatchContext.SecurityTokenService.EndIssue(ar);
- Complete(false);
- }
- catch (Exception e)
- {
- System.ServiceModel.DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- if (Fx.IsFatal(e)) throw;
- Complete(false, e);
- }
- }
- void OnRenewComplete(IAsyncResult ar)
- {
- try
- {
- _dispatchContext.ResponseMessage = _dispatchContext.SecurityTokenService.EndRenew(ar);
- Complete(false);
- }
- catch (Exception e)
- {
- System.ServiceModel.DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- if (Fx.IsFatal(e)) throw;
- Complete(false, e);
- }
- }
- void OnValidateComplete(IAsyncResult ar)
- {
- try
- {
- _dispatchContext.ResponseMessage = _dispatchContext.SecurityTokenService.EndValidate(ar);
- Complete(false);
- }
- catch (Exception e)
- {
- System.ServiceModel.DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- if (Fx.IsFatal(e)) throw;
- Complete(false, e);
- }
- }
- }
- #region IContractBehavior Members
- /// <summary>
- /// Configures any binding elements to support the contract behavior.
- /// </summary>
- /// <remarks>
- /// Inherited from IContractBehavior
- /// </remarks>
- public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
- {
- return;
- }
- /// <summary>
- /// Implements a modification or extension of the client across a contract.
- /// </summary>
- /// <remarks>
- /// Inherited from IContractBehavior
- /// </remarks>
- public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
- {
- return;
- }
- /// <summary>
- /// Implements a modification or extension of the client across a contract.
- /// </summary>
- /// <remarks>
- /// Inherited from IContractBehavior
- /// </remarks>
- public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime)
- {
- return;
- }
- /// <summary>
- /// Implement to confirm that the contract and endpoint can support the contract
- /// behavior.
- /// </summary>
- /// <remarks>
- /// Inherited from IContractBehavior
- /// </remarks>
- public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
- {
- return;
- }
- #endregion
- #region IWsdlExportExtension Members
- /// <summary>
- /// Implementation for IWsdlExportExtension.ExportContract. The default implementation
- /// does nothing. Can be overriden in the derived class for specific behavior.
- /// </summary>
- /// <param name="exporter">The WsdlExporter that exports the contract information.</param>
- /// <param name="context">Provides mappings from exported WSDL elements to the contract description.</param>
- public virtual void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
- {
- return;
- }
- /// <summary>
- /// Implements IWsdlExportExtensions.ExportEndpoint. The default implementation does the following,
- /// For every Trust contract found,
- /// 1. It includes the appropriate trust namespace in the WSDL.
- /// 2. Imports the appropriate Trust schema and all dependent schemas.
- /// 3. Fixes the Messages of each operation to it appropriate WS-Trust equivalent.
- /// Trust Contract exposed by the Framework takes a System.ServiceModel.Channels.Message in and
- /// returns a System.ServiceModel.Channels.Message out. But Trust messages expects and RST and
- /// returns an RSTR/RSTRC. This method fixes the message names with the appropriate WS-Trust
- /// messages.
- /// </summary>
- /// <param name="exporter">The WsdlExporter that exports the contract information.</param>
- /// <param name="context">Provides mappings from exported WSDL elements to the endpoint description.</param>
- /// <exception cref="ArgumentNullException">The input argument 'exporter' or 'context' is null.</exception>
- public virtual void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)
- {
- if (exporter == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("exporter");
- }
- if (context == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
- }
- if (context.WsdlPort == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID3146));
- }
- if (context.WsdlPort.Service == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID3147));
- }
- if (context.WsdlPort.Service.ServiceDescription == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID3148));
- }
- System.Web.Services.Description.ServiceDescription serviceDescription = context.WsdlPort.Service.ServiceDescription;
- // Iterate throught the Ports and for each of our contracts fix the input and output messages
- // of the contract and import the required schemas.
- foreach (PortType portType in serviceDescription.PortTypes)
- {
- if (StringComparer.Ordinal.Equals(portType.Name, WSTrustServiceContractConstants.Contracts.IWSTrustFeb2005Sync))
- {
- IncludeNamespace(context, WSTrustFeb2005Constants.Prefix, WSTrustFeb2005Constants.NamespaceURI);
- ImportSchema(exporter, context, WSTrustFeb2005Constants.NamespaceURI);
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005Cancel,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005Issue,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005Renew,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005Validate,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- }
- else if (StringComparer.OrdinalIgnoreCase.Equals(portType.Name, WSTrustServiceContractConstants.Contracts.IWSTrust13Sync))
- {
- IncludeNamespace(context, WSTrust13Constants.Prefix, WSTrust13Constants.NamespaceURI);
- ImportSchema(exporter, context, WSTrust13Constants.NamespaceURI);
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13Cancel,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13Issue,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13Renew,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13Validate,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- }
- else if (StringComparer.OrdinalIgnoreCase.Equals(portType.Name, WSTrustServiceContractConstants.Contracts.IWSTrustFeb2005Async))
- {
- IncludeNamespace(context, WSTrustFeb2005Constants.Prefix, WSTrustFeb2005Constants.NamespaceURI);
- ImportSchema(exporter, context, WSTrustFeb2005Constants.NamespaceURI);
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005CancelAsync,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005IssueAsync,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005RenewAsync,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.TrustFeb2005ValidateAsync,
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityToken,
- WSTrustFeb2005Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrustFeb2005Constants.ElementNames.RequestSecurityTokenResponse,
- WSTrustFeb2005Constants.NamespaceURI));
- }
- else if (StringComparer.OrdinalIgnoreCase.Equals(portType.Name, WSTrustServiceContractConstants.Contracts.IWSTrust13Async))
- {
- IncludeNamespace(context, WSTrust13Constants.Prefix, WSTrust13Constants.NamespaceURI);
- ImportSchema(exporter, context, WSTrust13Constants.NamespaceURI);
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13CancelAsync,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13IssueAsync,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13RenewAsync,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- FixMessageElement(
- serviceDescription,
- portType,
- context,
- WSTrustServiceContractConstants.Operations.Trust13ValidateAsync,
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityToken,
- WSTrust13Constants.NamespaceURI),
- new XmlQualifiedName(
- WSTrust13Constants.ElementNames.RequestSecurityTokenResponseCollection,
- WSTrust13Constants.NamespaceURI));
- }
- }
- }
- #endregion
- /// <summary>
- /// Adds the required WS-Trust namespaces to the WSDL if not already present.
- /// </summary>
- /// <param name="context">Provides mappings from exported WSDL elements to the endpoint description.</param>
- /// <param name="prefix">The prefix of the namespace to be included.</param>
- /// <param name="ns">Namespace to be included.</param>
- /// <exception cref="ArgumentException">Either 'prefix' or 'ns' is null or empty string.</exception>
- /// <exception cref="ArgumentNullException">The 'context' parameter is null.</exception>
- protected virtual void IncludeNamespace(WsdlEndpointConversionContext context, string prefix, string ns)
- {
- if (context == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
- }
- if (String.IsNullOrEmpty(prefix))
- {
- throw DiagnosticUtility.ThrowHelperArgumentNullOrEmptyString("prefix");
- }
- if (String.IsNullOrEmpty(ns))
- {
- throw DiagnosticUtility.ThrowHelperArgumentNullOrEmptyString("ns");
- }
- bool alreadyPresent = false;
- XmlQualifiedName[] namespaces = context.WsdlBinding.ServiceDescription.Namespaces.ToArray();
- for (int i = 0; i < namespaces.Length; ++i)
- {
- if (StringComparer.Ordinal.Equals(namespaces[i].Namespace, ns))
- {
- alreadyPresent = true;
- break;
- }
- }
- if (!alreadyPresent)
- {
- context.WsdlBinding.ServiceDescription.Namespaces.Add(prefix, ns);
- }
- }
- /// <summary>
- /// Imports all the required schema if not already present in the WSDL.
- /// The default implementation will import the following schemas,
- /// (a) WS-Trust Feb 2005.
- /// (b) WS-Trust 1.3
- /// Derived classes can override this method to import other schemas.
- /// </summary>
- /// <param name="exporter">The WsdlExporter that exports the contract information.</param>
- /// <param name="context">Provides mappings from exported WSDL elements to the endpoint description.</param>
- /// <param name="ns">The current WS-Trust namespace for which the schemas are imported.</param>
- /// <exception cref="ArgumentNullException">The parameter 'exporter' or 'context' is null.</exception>
- /// <exception cref="ArgumentException">The parameter 'ns' is either null or String.Empty.</exception>
- /// <exception cref="InvalidOperationException">The namespace 'ns' is not a recognized WS-Trust namespace.</exception>
- protected virtual void ImportSchema(WsdlExporter exporter, WsdlEndpointConversionContext context, string ns)
- {
- if (exporter == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("exporter");
- }
- if (context == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
- }
- if (String.IsNullOrEmpty(ns))
- {
- throw DiagnosticUtility.ThrowHelperArgumentNullOrEmptyString("ns");
- }
- foreach (XmlSchema xmlSchema in context.WsdlPort.Service.ServiceDescription.Types.Schemas)
- {
- foreach (XmlSchemaObject include in xmlSchema.Includes)
- {
- XmlSchemaImport schemaImport = include as XmlSchemaImport;
- if ((schemaImport != null) && StringComparer.Ordinal.Equals(schemaImport.Namespace, ns))
- {
- // The schema is already imported. Just return.
- return;
- }
- }
- }
- XmlSchema schema = GetXmlSchema(exporter, ns);
- if (schema == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID3004, ns));
- }
- XmlSchema importedSchema = null;
- if (context.WsdlPort.Service.ServiceDescription.Types.Schemas.Count == 0)
- {
- importedSchema = new XmlSchema();
- context.WsdlPort.Service.ServiceDescription.Types.Schemas.Add(importedSchema);
- }
- else
- {
- importedSchema = context.WsdlPort.Service.ServiceDescription.Types.Schemas[0];
- }
- XmlSchemaImport import = new XmlSchemaImport();
- import.Namespace = ns;
- exporter.GeneratedXmlSchemas.Add(schema);
- importedSchema.Includes.Add(import);
- }
- /// <summary>
- /// For a given namespace this method looks up the WsdlExporter to see if an XmlSchema has been cached and returns that.
- /// Else it loads the schema for that given namespace and returns the loaded XmlSchema.
- /// </summary>
- /// <param name="exporter">The WsdlExporter that exports the contract information.</param>
- /// <param name="ns">The namespace for which the schema is to be obtained.</param>
- /// <exception cref="ArgumentNullException">The parameter 'exporter' is null.</exception>
- /// <exception cref="ArgumentException">The parameter 'ns' is either null or String.Empty.</exception>
- /// <exception cref="InvalidOperationException">The namespace 'ns' is not a recognized WS-Trust namespace.</exception>
- static XmlSchema GetXmlSchema(WsdlExporter exporter, string ns)
- {
- if (exporter == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("exporter");
- }
- if (String.IsNullOrEmpty(ns))
- {
- throw DiagnosticUtility.ThrowHelperArgumentNullOrEmptyString("ns");
- }
- ICollection schemas = exporter.GeneratedXmlSchemas.Schemas(ns);
- if ((schemas != null) && (schemas.Count > 0))
- {
- foreach (XmlSchema s in schemas)
- {
- return s;
- }
- }
- string xmlSchema = null;
- switch (ns)
- {
- case WSTrustFeb2005Constants.NamespaceURI:
- xmlSchema = WSTrustFeb2005Constants.Schema;
- break;
- case WSTrust13Constants.NamespaceURI:
- xmlSchema = WSTrust13Constants.Schema;
- break;
- default:
- throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID5004, ns));
- }
- return XmlSchema.Read(new StringReader(xmlSchema), null);
- }
- /// <summary>
- /// During WSDL generation, the method fixes a given operation message element to refer to the
- /// RST and RSTR elements of the appropriate WS-Trust version.
- /// </summary>
- /// <param name="serviceDescription">The ServiceDescription that has the current state of the exported
- /// WSDL.</param>
- /// <param name="portType">The WSDL PortType whose messages are to be fixed.</param>
- /// <param name="context">Provides mappings from exported WSDL elements to the endpoint description.</param>
- /// <param name="operationName">The operation name inside the PortType.</param>
- /// <param name="inputMessageElement">The XmlQualifiedName of the input message element.</param>
- /// <param name="outputMessageElement">The XmlQualifiedName of the output message element.</param>
- /// <exception cref="ArgumentNullException">The parameter 'serviceDescription', 'portType', 'inputMessageType'
- /// or 'outputMessageType' is null.</exception>
- /// <exception cref="ArgumentException">The parameter 'operationName' is null or Empty.</exception>
- /// <remarks>
- /// Trust Contract exposed by the Framework takes a System.ServiceModel.Channels.Message in and
- /// returns a System.ServiceModel.Channels.Message out. But Trust messages expects and RST and
- /// returns an RSTR/RSTRC. This method fixes the message elements with the appropriate WS-Trust
- /// messages specified by the XmlQualified names 'inputMessageElement' and 'outputMessageElement'.
- /// </remarks>
- protected virtual void FixMessageElement(
- System.Web.Services.Description.ServiceDescription serviceDescription,
- PortType portType,
- WsdlEndpointConversionContext context,
- string operationName,
- XmlQualifiedName inputMessageElement,
- XmlQualifiedName outputMessageElement)
- {
- if (serviceDescription == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceDescription");
- }
- if (portType == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("portType");
- }
- if (context == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
- }
- if (String.IsNullOrEmpty(operationName))
- {
- throw DiagnosticUtility.ThrowHelperArgumentNullOrEmptyString("operationName");
- }
- if (inputMessageElement == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("inputMessageElement");
- }
- if (outputMessageElement == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("outputMessageElement");
- }
- Operation operation = null;
- System.Web.Services.Description.Message inputMessage = null;
- System.Web.Services.Description.Message outputMessage = null;
- foreach (Operation op in portType.Operations)
- {
- if (StringComparer.Ordinal.Equals(op.Name, operationName))
- {
- operation = op;
- // Find the correspinding message in the messages collection.
- foreach (System.Web.Services.Description.Message message in serviceDescription.Messages)
- {
- if (StringComparer.Ordinal.Equals(message.Name, op.Messages.Input.Message.Name))
- {
- if (message.Parts.Count != 1)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(
- SR.GetString(SR.ID3144, portType.Name, op.Name, message.Name, message.Parts.Count));
- }
- inputMessage = message;
- }
- else if (StringComparer.Ordinal.Equals(message.Name, op.Messages.Output.Message.Name))
- {
- if (message.Parts.Count != 1)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(
- SR.GetString(SR.ID3144, portType.Name, op.Name, message.Name, message.Parts.Count));
- }
- outputMessage = message;
- }
- if ((inputMessage != null) && (outputMessage != null))
- {
- break;
- }
- }
- }
- if (operation != null)
- {
- break;
- }
- }
- if (operation == null)
- {
- // This operation is missing. This might be due to another Behavior that has modified the WSDL as
- // well. Ignore this and return.
- return;
- }
- if (inputMessage == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(
- SR.GetString(SR.ID3149, portType.Name, portType.Namespaces, operationName));
- }
- if (outputMessage == null)
- {
- throw DiagnosticUtility.ThrowHelperInvalidOperation(
- SR.GetString(SR.ID3150, portType.Name, portType.Namespaces, operationName));
- }
- inputMessage.Parts[0].Element = inputMessageElement;
- outputMessage.Parts[0].Element = outputMessageElement;
- inputMessage.Parts[0].Type = null;
- outputMessage.Parts[0].Type = null;
- }
- }
- }
|