ImpersonatingMessage.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System.Security.Principal;
  7. using System.ServiceModel.Channels;
  8. using System.Xml;
  9. sealed class ImpersonatingMessage : Message
  10. {
  11. Message innerMessage;
  12. public ImpersonatingMessage(Message innerMessage)
  13. {
  14. if (innerMessage == null)
  15. {
  16. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("innerMessage");
  17. }
  18. this.innerMessage = innerMessage;
  19. }
  20. public override bool IsEmpty
  21. {
  22. get
  23. {
  24. return this.innerMessage.IsEmpty;
  25. }
  26. }
  27. public override bool IsFault
  28. {
  29. get { return this.innerMessage.IsFault; }
  30. }
  31. public override MessageHeaders Headers
  32. {
  33. get { return this.innerMessage.Headers; }
  34. }
  35. public override MessageProperties Properties
  36. {
  37. get { return this.innerMessage.Properties; }
  38. }
  39. public override MessageVersion Version
  40. {
  41. get { return this.innerMessage.Version; }
  42. }
  43. internal override RecycledMessageState RecycledMessageState
  44. {
  45. get
  46. {
  47. return this.innerMessage.RecycledMessageState;
  48. }
  49. }
  50. protected override void OnClose()
  51. {
  52. base.OnClose();
  53. this.innerMessage.Close();
  54. }
  55. //Runs impersonated.
  56. protected override IAsyncResult OnBeginWriteMessage(XmlDictionaryWriter writer, AsyncCallback callback, object state)
  57. {
  58. ImpersonateOnSerializingReplyMessageProperty impersonationProperty = null;
  59. IDisposable impersonationContext = null;
  60. IPrincipal originalPrincipal = null;
  61. bool isThreadPrincipalSet = false;
  62. if (!ImpersonateOnSerializingReplyMessageProperty.TryGet(this.innerMessage, out impersonationProperty))
  63. {
  64. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnableToImpersonateWhileSerializingReponse)));
  65. }
  66. try
  67. {
  68. impersonationProperty.StartImpersonation(out impersonationContext, out originalPrincipal, out isThreadPrincipalSet);
  69. return this.innerMessage.BeginWriteMessage(writer, callback, state);
  70. }
  71. finally
  72. {
  73. try
  74. {
  75. impersonationProperty.StopImpersonation(impersonationContext, originalPrincipal, isThreadPrincipalSet);
  76. }
  77. #pragma warning suppress 56500 // covered by FxCOP
  78. catch
  79. {
  80. string message = null;
  81. try
  82. {
  83. message = SR.GetString(SR.SFxRevertImpersonationFailed0);
  84. }
  85. finally
  86. {
  87. DiagnosticUtility.FailFast(message);
  88. }
  89. }
  90. }
  91. }
  92. //Runs impersonated.
  93. protected override void OnWriteMessage(XmlDictionaryWriter writer)
  94. {
  95. this.ImpersonateCall(() => this.innerMessage.WriteMessage(writer));
  96. }
  97. protected override void OnEndWriteMessage(IAsyncResult result)
  98. {
  99. this.innerMessage.EndWriteMessage(result);
  100. }
  101. protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
  102. {
  103. this.innerMessage.WriteStartEnvelope(writer);
  104. }
  105. protected override void OnWriteStartHeaders(XmlDictionaryWriter writer)
  106. {
  107. this.innerMessage.WriteStartHeaders(writer);
  108. }
  109. protected override void OnWriteStartBody(XmlDictionaryWriter writer)
  110. {
  111. this.innerMessage.WriteStartBody(writer);
  112. }
  113. protected override string OnGetBodyAttribute(string localName, string ns)
  114. {
  115. return this.innerMessage.GetBodyAttribute(localName, ns);
  116. }
  117. protected override MessageBuffer OnCreateBufferedCopy(int maxBufferSize)
  118. {
  119. return this.innerMessage.CreateBufferedCopy(maxBufferSize);
  120. }
  121. protected override IAsyncResult OnBeginWriteBodyContents(XmlDictionaryWriter writer, AsyncCallback callback, object state)
  122. {
  123. ImpersonateOnSerializingReplyMessageProperty impersonationProperty = null;
  124. IDisposable impersonationContext = null;
  125. IPrincipal originalPrincipal = null;
  126. bool isThreadPrincipalSet = false;
  127. if (!ImpersonateOnSerializingReplyMessageProperty.TryGet(this.innerMessage, out impersonationProperty))
  128. {
  129. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnableToImpersonateWhileSerializingReponse)));
  130. }
  131. try
  132. {
  133. impersonationProperty.StartImpersonation(out impersonationContext, out originalPrincipal, out isThreadPrincipalSet);
  134. return this.innerMessage.BeginWriteBodyContents(writer, callback, state);
  135. }
  136. finally
  137. {
  138. try
  139. {
  140. impersonationProperty.StopImpersonation(impersonationContext, originalPrincipal, isThreadPrincipalSet);
  141. }
  142. #pragma warning suppress 56500 // covered by FxCOP
  143. catch
  144. {
  145. string message = null;
  146. try
  147. {
  148. message = SR.GetString(SR.SFxRevertImpersonationFailed0);
  149. }
  150. finally
  151. {
  152. DiagnosticUtility.FailFast(message);
  153. }
  154. }
  155. }
  156. }
  157. protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
  158. {
  159. this.ImpersonateCall( () => this.innerMessage.WriteBodyContents(writer));
  160. }
  161. protected override void OnEndWriteBodyContents(IAsyncResult result)
  162. {
  163. this.innerMessage.EndWriteBodyContents(result);
  164. }
  165. //Runs impersonated.
  166. protected override void OnBodyToString(XmlDictionaryWriter writer)
  167. {
  168. this.ImpersonateCall(() => this.innerMessage.BodyToString(writer));
  169. }
  170. void ImpersonateCall(Action callToImpersonate)
  171. {
  172. ImpersonateOnSerializingReplyMessageProperty impersonationProperty = null;
  173. IDisposable impersonationContext = null;
  174. IPrincipal originalPrincipal = null;
  175. bool isThreadPrincipalSet = false;
  176. if (!ImpersonateOnSerializingReplyMessageProperty.TryGet(this.innerMessage, out impersonationProperty))
  177. {
  178. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnableToImpersonateWhileSerializingReponse)));
  179. }
  180. try
  181. {
  182. impersonationProperty.StartImpersonation(out impersonationContext, out originalPrincipal, out isThreadPrincipalSet);
  183. callToImpersonate();
  184. }
  185. finally
  186. {
  187. try
  188. {
  189. impersonationProperty.StopImpersonation(impersonationContext, originalPrincipal, isThreadPrincipalSet);
  190. }
  191. #pragma warning suppress 56500 // covered by FxCOP
  192. catch
  193. {
  194. string message = null;
  195. try
  196. {
  197. message = SR.GetString(SR.SFxRevertImpersonationFailed0);
  198. }
  199. finally
  200. {
  201. DiagnosticUtility.FailFast(message);
  202. }
  203. }
  204. }
  205. }
  206. }
  207. }