MessageSecurityOverMsmq.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System.Runtime;
  7. using System.ComponentModel;
  8. using System.Runtime.CompilerServices;
  9. using System.ServiceModel.Channels;
  10. using System.ServiceModel.Security;
  11. using System.ServiceModel.Security.Tokens;
  12. public sealed class MessageSecurityOverMsmq
  13. {
  14. internal const MessageCredentialType DefaultClientCredentialType = MessageCredentialType.Windows;
  15. MessageCredentialType clientCredentialType;
  16. SecurityAlgorithmSuite algorithmSuite;
  17. bool wasAlgorithmSuiteSet;
  18. public MessageSecurityOverMsmq()
  19. {
  20. clientCredentialType = DefaultClientCredentialType;
  21. algorithmSuite = SecurityAlgorithmSuite.Default;
  22. }
  23. [DefaultValue(MsmqDefaults.DefaultClientCredentialType)]
  24. public MessageCredentialType ClientCredentialType
  25. {
  26. get { return this.clientCredentialType; }
  27. set
  28. {
  29. if (!MessageCredentialTypeHelper.IsDefined(value))
  30. {
  31. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value"));
  32. }
  33. this.clientCredentialType = value;
  34. }
  35. }
  36. [DefaultValue(typeof(SecurityAlgorithmSuite), System.ServiceModel.Configuration.ConfigurationStrings.Default)]
  37. public SecurityAlgorithmSuite AlgorithmSuite
  38. {
  39. get { return this.algorithmSuite; }
  40. set
  41. {
  42. if (value == null)
  43. {
  44. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
  45. }
  46. this.algorithmSuite = value;
  47. wasAlgorithmSuiteSet = true;
  48. }
  49. }
  50. internal bool WasAlgorithmSuiteSet
  51. {
  52. get { return this.wasAlgorithmSuiteSet; }
  53. }
  54. [MethodImpl(MethodImplOptions.NoInlining)]
  55. internal SecurityBindingElement CreateSecurityBindingElement()
  56. {
  57. SymmetricSecurityBindingElement result;
  58. bool isKerberosSelected = false;
  59. switch (this.clientCredentialType)
  60. {
  61. case MessageCredentialType.None:
  62. result = SecurityBindingElement.CreateAnonymousForCertificateBindingElement();
  63. break;
  64. case MessageCredentialType.UserName:
  65. result = SecurityBindingElement.CreateUserNameForCertificateBindingElement();
  66. break;
  67. case MessageCredentialType.Certificate:
  68. result = (SymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement();
  69. break;
  70. case MessageCredentialType.Windows:
  71. result = SecurityBindingElement.CreateKerberosBindingElement();
  72. isKerberosSelected = true;
  73. break;
  74. case MessageCredentialType.IssuedToken:
  75. result = SecurityBindingElement.CreateIssuedTokenForCertificateBindingElement(IssuedSecurityTokenParameters.CreateInfoCardParameters(new SecurityStandardsManager(), this.algorithmSuite));
  76. break;
  77. default:
  78. Fx.Assert("unknown ClientCredentialType");
  79. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
  80. }
  81. result.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11;
  82. // set the algorithm suite and issued token params if required
  83. if (wasAlgorithmSuiteSet || !isKerberosSelected)
  84. {
  85. result.DefaultAlgorithmSuite = this.AlgorithmSuite;
  86. }
  87. else if (isKerberosSelected)
  88. {
  89. result.DefaultAlgorithmSuite = SecurityAlgorithmSuite.KerberosDefault;
  90. }
  91. result.IncludeTimestamp = false;
  92. result.LocalServiceSettings.DetectReplays = false;
  93. result.LocalClientSettings.DetectReplays = false;
  94. return result;
  95. }
  96. internal static bool TryCreate(SecurityBindingElement sbe, out MessageSecurityOverMsmq messageSecurity)
  97. {
  98. messageSecurity = null;
  99. if (sbe == null)
  100. return false;
  101. SymmetricSecurityBindingElement ssbe = sbe as SymmetricSecurityBindingElement;
  102. if (ssbe == null)
  103. return false;
  104. if (sbe.MessageSecurityVersion != MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10
  105. && sbe.MessageSecurityVersion != MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11)
  106. {
  107. return false;
  108. }
  109. // do not check local settings: sbe.LocalServiceSettings and sbe.LocalClientSettings
  110. if (ssbe.IncludeTimestamp)
  111. return false;
  112. bool isKerberosSelected = false;
  113. MessageCredentialType clientCredentialType;
  114. IssuedSecurityTokenParameters issuedParameters;
  115. if (SecurityBindingElement.IsAnonymousForCertificateBinding(sbe))
  116. {
  117. clientCredentialType = MessageCredentialType.None;
  118. }
  119. else if (SecurityBindingElement.IsUserNameForCertificateBinding(sbe))
  120. {
  121. clientCredentialType = MessageCredentialType.UserName;
  122. }
  123. else if (SecurityBindingElement.IsMutualCertificateBinding(sbe))
  124. {
  125. clientCredentialType = MessageCredentialType.Certificate;
  126. }
  127. else if (SecurityBindingElement.IsKerberosBinding(sbe))
  128. {
  129. clientCredentialType = MessageCredentialType.Windows;
  130. isKerberosSelected = true;
  131. }
  132. else if (SecurityBindingElement.IsIssuedTokenForCertificateBinding(sbe, out issuedParameters))
  133. {
  134. if (!IssuedSecurityTokenParameters.IsInfoCardParameters(
  135. issuedParameters,
  136. new SecurityStandardsManager(
  137. sbe.MessageSecurityVersion,
  138. new WSSecurityTokenSerializer(
  139. sbe.MessageSecurityVersion.SecurityVersion,
  140. sbe.MessageSecurityVersion.TrustVersion,
  141. sbe.MessageSecurityVersion.SecureConversationVersion,
  142. true,
  143. null, null, null))))
  144. return false;
  145. clientCredentialType = MessageCredentialType.IssuedToken;
  146. }
  147. else
  148. {
  149. return false;
  150. }
  151. messageSecurity = new MessageSecurityOverMsmq();
  152. messageSecurity.ClientCredentialType = clientCredentialType;
  153. // set the algorithm suite and issued token params if required
  154. if (clientCredentialType != MessageCredentialType.IssuedToken && !isKerberosSelected)
  155. {
  156. messageSecurity.AlgorithmSuite = ssbe.DefaultAlgorithmSuite;
  157. }
  158. return true;
  159. }
  160. }
  161. }