WS2007FederationHttpBinding.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 WS2007FederationHttpBinding : WSFederationHttpBinding
  21. {
  22. static readonly ReliableMessagingVersion WS2007ReliableMessagingVersion = ReliableMessagingVersion.WSReliableMessaging11;
  23. static readonly TransactionProtocol WS2007TransactionProtocol = TransactionProtocol.WSAtomicTransaction11;
  24. static readonly MessageSecurityVersion WS2007MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
  25. public WS2007FederationHttpBinding(string configName)
  26. : this()
  27. {
  28. ApplyConfiguration(configName);
  29. }
  30. public WS2007FederationHttpBinding()
  31. : base()
  32. {
  33. this.ReliableSessionBindingElement.ReliableMessagingVersion = WS2007ReliableMessagingVersion;
  34. this.TransactionFlowBindingElement.TransactionProtocol = WS2007TransactionProtocol;
  35. this.HttpsTransport.MessageSecurityVersion = WS2007MessageSecurityVersion;
  36. }
  37. public WS2007FederationHttpBinding(WSFederationHttpSecurityMode securityMode)
  38. : this(securityMode, false)
  39. {
  40. }
  41. public WS2007FederationHttpBinding(WSFederationHttpSecurityMode 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. WS2007FederationHttpBinding(WSFederationHttpSecurity security, PrivacyNoticeBindingElement privacy, bool reliableSessionEnabled)
  49. : base(security, privacy, 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. WS2007FederationHttpBindingCollectionElement section = WS2007FederationHttpBindingCollectionElement.GetBindingCollectionElement();
  58. WS2007FederationHttpBindingElement 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.WS2007FederationHttpBindingCollectionElementName)));
  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. internal new static bool TryCreate(SecurityBindingElement sbe, TransportBindingElement transport, PrivacyNoticeBindingElement privacy, ReliableSessionBindingElement rsbe, TransactionFlowBindingElement tfbe, out Binding binding)
  76. {
  77. bool isReliableSession = (rsbe != null);
  78. binding = null;
  79. // reverse GetTransport
  80. HttpTransportSecurity transportSecurity = new HttpTransportSecurity();
  81. WSFederationHttpSecurityMode mode;
  82. if (!WSFederationHttpBinding.GetSecurityModeFromTransport(transport, transportSecurity, out mode))
  83. {
  84. return false;
  85. }
  86. HttpsTransportBindingElement httpsBinding = transport as HttpsTransportBindingElement;
  87. if (httpsBinding != null && httpsBinding.MessageSecurityVersion != null)
  88. {
  89. if (httpsBinding.MessageSecurityVersion.SecurityPolicyVersion != WS2007MessageSecurityVersion.SecurityPolicyVersion)
  90. {
  91. return false;
  92. }
  93. }
  94. WSFederationHttpSecurity security;
  95. if (WS2007FederationHttpBinding.TryCreateSecurity(sbe, mode, transportSecurity, isReliableSession, out security))
  96. {
  97. binding = new WS2007FederationHttpBinding(security, privacy, isReliableSession);
  98. }
  99. if (rsbe != null && rsbe.ReliableMessagingVersion != ReliableMessagingVersion.WSReliableMessaging11)
  100. {
  101. return false;
  102. }
  103. if (tfbe != null && tfbe.TransactionProtocol != TransactionProtocol.WSAtomicTransaction11)
  104. {
  105. return false;
  106. }
  107. return binding != null;
  108. }
  109. static bool TryCreateSecurity(SecurityBindingElement sbe, WSFederationHttpSecurityMode mode, HttpTransportSecurity transportSecurity, bool isReliableSession, out WSFederationHttpSecurity security)
  110. {
  111. if (!WSFederationHttpSecurity.TryCreate(sbe, mode, transportSecurity, isReliableSession, WS2007MessageSecurityVersion, out security))
  112. return false;
  113. // the last check: make sure that security binding element match the incoming security
  114. return SecurityElement.AreBindingsMatching(security.CreateMessageSecurity(isReliableSession, WS2007MessageSecurityVersion), sbe);
  115. }
  116. }
  117. }