WS2007HttpBinding.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System;
  7. using System.Text;
  8. using System.Collections.Generic;
  9. using System.Collections.ObjectModel;
  10. using System.Configuration;
  11. using System.Globalization;
  12. using System.Net;
  13. using System.Net.Security;
  14. using System.Runtime.Serialization;
  15. using System.Security.Principal;
  16. using System.ServiceModel.Channels;
  17. using System.ServiceModel.Configuration;
  18. using System.ServiceModel.Security;
  19. using System.Xml;
  20. public class WS2007HttpBinding : WSHttpBinding
  21. {
  22. static readonly ReliableMessagingVersion WS2007ReliableMessagingVersion = ReliableMessagingVersion.WSReliableMessaging11;
  23. static readonly TransactionProtocol WS2007TransactionProtocol = TransactionProtocol.WSAtomicTransaction11;
  24. static readonly MessageSecurityVersion WS2007MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
  25. public WS2007HttpBinding(string configName)
  26. : this()
  27. {
  28. ApplyConfiguration(configName);
  29. }
  30. public WS2007HttpBinding()
  31. : base()
  32. {
  33. this.ReliableSessionBindingElement.ReliableMessagingVersion = WS2007ReliableMessagingVersion;
  34. this.TransactionFlowBindingElement.TransactionProtocol = WS2007TransactionProtocol;
  35. this.HttpsTransport.MessageSecurityVersion = WS2007MessageSecurityVersion;
  36. }
  37. public WS2007HttpBinding(SecurityMode securityMode)
  38. : this(securityMode, false)
  39. {
  40. }
  41. public WS2007HttpBinding(SecurityMode securityMode, bool reliableSessionEnabled)
  42. : base(securityMode, reliableSessionEnabled)
  43. {
  44. this.ReliableSessionBindingElement.ReliableMessagingVersion = WS2007ReliableMessagingVersion;
  45. this.TransactionFlowBindingElement.TransactionProtocol = WS2007TransactionProtocol;
  46. this.HttpsTransport.MessageSecurityVersion = WS2007MessageSecurityVersion;
  47. }
  48. internal WS2007HttpBinding(WSHttpSecurity security, bool reliableSessionEnabled)
  49. : base(security, reliableSessionEnabled)
  50. {
  51. this.ReliableSessionBindingElement.ReliableMessagingVersion = WS2007ReliableMessagingVersion;
  52. this.TransactionFlowBindingElement.TransactionProtocol = WS2007TransactionProtocol;
  53. this.HttpsTransport.MessageSecurityVersion = WS2007MessageSecurityVersion;
  54. }
  55. void ApplyConfiguration(string configurationName)
  56. {
  57. WS2007HttpBindingCollectionElement section = WS2007HttpBindingCollectionElement.GetBindingCollectionElement();
  58. WS2007HttpBindingElement element = section.Bindings[configurationName];
  59. if (element == null)
  60. {
  61. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(
  62. SR.GetString(SR.ConfigInvalidBindingConfigurationName,
  63. configurationName,
  64. ConfigurationStrings.WS2007HttpBindingCollectionElementName)));
  65. }
  66. else
  67. {
  68. element.ApplyConfiguration(this);
  69. }
  70. }
  71. protected override SecurityBindingElement CreateMessageSecurity()
  72. {
  73. return this.Security.CreateMessageSecurity(this.ReliableSession.Enabled, WS2007MessageSecurityVersion);
  74. }
  75. // This is effectively just a copy of WSHttpBinding.TryCreate(), only it news up the 2007 version
  76. internal new static bool TryCreate(SecurityBindingElement sbe, TransportBindingElement transport, ReliableSessionBindingElement rsbe, TransactionFlowBindingElement tfbe, out Binding binding)
  77. {
  78. bool isReliableSession = (rsbe != null);
  79. binding = null;
  80. // reverse GetTransport
  81. HttpTransportSecurity transportSecurity = WSHttpSecurity.GetDefaultHttpTransportSecurity();
  82. UnifiedSecurityMode mode;
  83. if (!WSHttpBinding.GetSecurityModeFromTransport(transport, transportSecurity, out mode))
  84. {
  85. return false;
  86. }
  87. HttpsTransportBindingElement httpsBinding = transport as HttpsTransportBindingElement;
  88. if (httpsBinding != null && httpsBinding.MessageSecurityVersion != null)
  89. {
  90. if (httpsBinding.MessageSecurityVersion.SecurityPolicyVersion != WS2007MessageSecurityVersion.SecurityPolicyVersion)
  91. {
  92. return false;
  93. }
  94. }
  95. WSHttpSecurity security;
  96. if (WS2007HttpBinding.TryCreateSecurity(sbe, mode, transportSecurity, isReliableSession, out security))
  97. {
  98. WS2007HttpBinding ws2007HttpBinding = new WS2007HttpBinding(security, isReliableSession);
  99. bool allowCookies;
  100. if (!WSHttpBinding.TryGetAllowCookiesFromTransport(transport, out allowCookies))
  101. {
  102. return false;
  103. }
  104. ws2007HttpBinding.AllowCookies = allowCookies;
  105. binding = ws2007HttpBinding;
  106. }
  107. if (rsbe != null && rsbe.ReliableMessagingVersion != ReliableMessagingVersion.WSReliableMessaging11)
  108. {
  109. return false;
  110. }
  111. if (tfbe != null && tfbe.TransactionProtocol != TransactionProtocol.WSAtomicTransaction11)
  112. {
  113. return false;
  114. }
  115. return binding != null;
  116. }
  117. // This is effectively just a copy of WSHttpBinding.TryCreateSecurity(), only it passes the 2007 security version
  118. static bool TryCreateSecurity(SecurityBindingElement sbe, UnifiedSecurityMode mode, HttpTransportSecurity transportSecurity, bool isReliableSession, out WSHttpSecurity security)
  119. {
  120. if (!WSHttpSecurity.TryCreate(sbe, mode, transportSecurity, isReliableSession, out security))
  121. return false;
  122. // the last check: make sure that security binding element match the incoming security
  123. return SecurityElement.AreBindingsMatching(security.CreateMessageSecurity(isReliableSession, WS2007MessageSecurityVersion), sbe);
  124. }
  125. }
  126. }