| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Security
- {
- using System.Security.Principal;
- using System.ServiceModel.Channels;
- using System.Xml;
- sealed class ImpersonatingMessage : Message
- {
- Message innerMessage;
- public ImpersonatingMessage(Message innerMessage)
- {
- if (innerMessage == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("innerMessage");
- }
- this.innerMessage = innerMessage;
- }
- public override bool IsEmpty
- {
- get
- {
- return this.innerMessage.IsEmpty;
- }
- }
- public override bool IsFault
- {
- get { return this.innerMessage.IsFault; }
- }
- public override MessageHeaders Headers
- {
- get { return this.innerMessage.Headers; }
- }
- public override MessageProperties Properties
- {
- get { return this.innerMessage.Properties; }
- }
- public override MessageVersion Version
- {
- get { return this.innerMessage.Version; }
- }
- internal override RecycledMessageState RecycledMessageState
- {
- get
- {
- return this.innerMessage.RecycledMessageState;
- }
- }
- protected override void OnClose()
- {
- base.OnClose();
- this.innerMessage.Close();
- }
- //Runs impersonated.
- protected override IAsyncResult OnBeginWriteMessage(XmlDictionaryWriter writer, AsyncCallback callback, object state)
- {
- ImpersonateOnSerializingReplyMessageProperty impersonationProperty = null;
- IDisposable impersonationContext = null;
- IPrincipal originalPrincipal = null;
- bool isThreadPrincipalSet = false;
- if (!ImpersonateOnSerializingReplyMessageProperty.TryGet(this.innerMessage, out impersonationProperty))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnableToImpersonateWhileSerializingReponse)));
- }
- try
- {
- impersonationProperty.StartImpersonation(out impersonationContext, out originalPrincipal, out isThreadPrincipalSet);
- return this.innerMessage.BeginWriteMessage(writer, callback, state);
- }
- finally
- {
- try
- {
- impersonationProperty.StopImpersonation(impersonationContext, originalPrincipal, isThreadPrincipalSet);
- }
- #pragma warning suppress 56500 // covered by FxCOP
- catch
- {
- string message = null;
- try
- {
- message = SR.GetString(SR.SFxRevertImpersonationFailed0);
- }
- finally
- {
- DiagnosticUtility.FailFast(message);
- }
- }
- }
- }
- //Runs impersonated.
- protected override void OnWriteMessage(XmlDictionaryWriter writer)
- {
- this.ImpersonateCall(() => this.innerMessage.WriteMessage(writer));
- }
-
- protected override void OnEndWriteMessage(IAsyncResult result)
- {
- this.innerMessage.EndWriteMessage(result);
- }
- protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
- {
- this.innerMessage.WriteStartEnvelope(writer);
- }
- protected override void OnWriteStartHeaders(XmlDictionaryWriter writer)
- {
- this.innerMessage.WriteStartHeaders(writer);
- }
- protected override void OnWriteStartBody(XmlDictionaryWriter writer)
- {
- this.innerMessage.WriteStartBody(writer);
- }
- protected override string OnGetBodyAttribute(string localName, string ns)
- {
- return this.innerMessage.GetBodyAttribute(localName, ns);
- }
- protected override MessageBuffer OnCreateBufferedCopy(int maxBufferSize)
- {
- return this.innerMessage.CreateBufferedCopy(maxBufferSize);
- }
-
- protected override IAsyncResult OnBeginWriteBodyContents(XmlDictionaryWriter writer, AsyncCallback callback, object state)
- {
- ImpersonateOnSerializingReplyMessageProperty impersonationProperty = null;
- IDisposable impersonationContext = null;
- IPrincipal originalPrincipal = null;
- bool isThreadPrincipalSet = false;
- if (!ImpersonateOnSerializingReplyMessageProperty.TryGet(this.innerMessage, out impersonationProperty))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnableToImpersonateWhileSerializingReponse)));
- }
- try
- {
- impersonationProperty.StartImpersonation(out impersonationContext, out originalPrincipal, out isThreadPrincipalSet);
- return this.innerMessage.BeginWriteBodyContents(writer, callback, state);
- }
- finally
- {
- try
- {
- impersonationProperty.StopImpersonation(impersonationContext, originalPrincipal, isThreadPrincipalSet);
- }
- #pragma warning suppress 56500 // covered by FxCOP
- catch
- {
- string message = null;
- try
- {
- message = SR.GetString(SR.SFxRevertImpersonationFailed0);
- }
- finally
- {
- DiagnosticUtility.FailFast(message);
- }
- }
- }
-
-
- }
- protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
- {
- this.ImpersonateCall( () => this.innerMessage.WriteBodyContents(writer));
- }
- protected override void OnEndWriteBodyContents(IAsyncResult result)
- {
- this.innerMessage.EndWriteBodyContents(result);
- }
- //Runs impersonated.
- protected override void OnBodyToString(XmlDictionaryWriter writer)
- {
- this.ImpersonateCall(() => this.innerMessage.BodyToString(writer));
- }
- void ImpersonateCall(Action callToImpersonate)
- {
- ImpersonateOnSerializingReplyMessageProperty impersonationProperty = null;
- IDisposable impersonationContext = null;
- IPrincipal originalPrincipal = null;
- bool isThreadPrincipalSet = false;
- if (!ImpersonateOnSerializingReplyMessageProperty.TryGet(this.innerMessage, out impersonationProperty))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnableToImpersonateWhileSerializingReponse)));
- }
- try
- {
- impersonationProperty.StartImpersonation(out impersonationContext, out originalPrincipal, out isThreadPrincipalSet);
- callToImpersonate();
- }
- finally
- {
- try
- {
- impersonationProperty.StopImpersonation(impersonationContext, originalPrincipal, isThreadPrincipalSet);
- }
- #pragma warning suppress 56500 // covered by FxCOP
- catch
- {
- string message = null;
- try
- {
- message = SR.GetString(SR.SFxRevertImpersonationFailed0);
- }
- finally
- {
- DiagnosticUtility.FailFast(message);
- }
- }
- }
- }
- }
- }
|