PeerSecuritySettings.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System.Runtime;
  7. using System.ServiceModel.Channels;
  8. using System.ServiceModel.Configuration;
  9. using System.ServiceModel.Description;
  10. using System.Xml;
  11. using System.ComponentModel;
  12. public sealed class PeerSecuritySettings
  13. {
  14. internal const SecurityMode DefaultMode = SecurityMode.Transport;
  15. SecurityMode mode;
  16. PeerTransportSecuritySettings transportSecurity;
  17. public PeerSecuritySettings()
  18. {
  19. mode = DefaultMode;
  20. transportSecurity = new PeerTransportSecuritySettings();
  21. }
  22. internal PeerSecuritySettings(PeerSecuritySettings other)
  23. {
  24. this.mode = other.mode;
  25. this.transportSecurity = new PeerTransportSecuritySettings(other.transportSecurity);
  26. }
  27. internal PeerSecuritySettings(PeerSecurityElement element)
  28. {
  29. mode = element.Mode;
  30. transportSecurity = new PeerTransportSecuritySettings(element.Transport);
  31. }
  32. public SecurityMode Mode
  33. {
  34. get { return this.mode; }
  35. set
  36. {
  37. if (!SecurityModeHelper.IsDefined(value))
  38. {
  39. PeerExceptionHelper.ThrowArgumentOutOfRange_InvalidSecurityMode((int)value);
  40. }
  41. this.mode = value;
  42. }
  43. }
  44. public PeerTransportSecuritySettings Transport
  45. {
  46. get { return this.transportSecurity; }
  47. set { this.transportSecurity = value; }
  48. }
  49. internal bool SupportsAuthentication
  50. {
  51. get
  52. {
  53. return this.Mode == SecurityMode.Transport || this.Mode == SecurityMode.TransportWithMessageCredential;
  54. }
  55. }
  56. internal System.Net.Security.ProtectionLevel SupportedProtectionLevel
  57. {
  58. get
  59. {
  60. System.Net.Security.ProtectionLevel level = System.Net.Security.ProtectionLevel.None;
  61. if (this.Mode == SecurityMode.Message || this.Mode == SecurityMode.TransportWithMessageCredential)
  62. {
  63. level = System.Net.Security.ProtectionLevel.Sign;
  64. }
  65. return level;
  66. }
  67. }
  68. internal void OnImportPolicy(MetadataImporter importer, PolicyConversionContext context)
  69. {
  70. XmlElement element = PolicyConversionContext.FindAssertion(context.GetBindingAssertions(),
  71. PeerTransportPolicyConstants.PeerTransportSecurityMode,
  72. TransportPolicyConstants.PeerTransportUri, true);
  73. this.Mode = SecurityMode.Transport;
  74. if (element != null)
  75. {
  76. switch (element.InnerText)
  77. {
  78. case PeerTransportPolicyConstants.PeerTransportSecurityModeNone:
  79. this.Mode = SecurityMode.None;
  80. break;
  81. case PeerTransportPolicyConstants.PeerTransportSecurityModeTransport:
  82. this.Mode = SecurityMode.Transport;
  83. break;
  84. case PeerTransportPolicyConstants.PeerTransportSecurityModeMessage:
  85. this.Mode = SecurityMode.Message;
  86. break;
  87. case PeerTransportPolicyConstants.PeerTransportSecurityModeTransportWithMessageCredential:
  88. this.Mode = SecurityMode.TransportWithMessageCredential;
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. transportSecurity.OnImportPolicy(importer, context);
  95. }
  96. internal void OnExportPolicy(MetadataExporter exporter, PolicyConversionContext context)
  97. {
  98. string assertion = "";
  99. switch (this.Mode)
  100. {
  101. case SecurityMode.None:
  102. assertion = PeerTransportPolicyConstants.PeerTransportSecurityModeNone;
  103. break;
  104. case SecurityMode.Transport:
  105. assertion = PeerTransportPolicyConstants.PeerTransportSecurityModeTransport;
  106. break;
  107. case SecurityMode.Message:
  108. assertion = PeerTransportPolicyConstants.PeerTransportSecurityModeMessage;
  109. break;
  110. case SecurityMode.TransportWithMessageCredential:
  111. assertion = PeerTransportPolicyConstants.PeerTransportSecurityModeTransportWithMessageCredential;
  112. break;
  113. default:
  114. Fx.Assert("Unsupported value for PeerSecuritySettings.Mode");
  115. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
  116. }
  117. XmlDocument doc = new XmlDocument();
  118. XmlElement element = doc.CreateElement(PeerTransportPolicyConstants.PeerTransportPrefix,
  119. PeerTransportPolicyConstants.PeerTransportSecurityMode,
  120. TransportPolicyConstants.PeerTransportUri);
  121. element.InnerText = assertion;
  122. context.GetBindingAssertions().Add(element);
  123. transportSecurity.OnExportPolicy(exporter, context);
  124. }
  125. internal bool InternalShouldSerialize()
  126. {
  127. return this.ShouldSerializeMode()
  128. || this.ShouldSerializeTransport();
  129. }
  130. [EditorBrowsable(EditorBrowsableState.Never)]
  131. public bool ShouldSerializeMode()
  132. {
  133. return this.Mode != DefaultMode;
  134. }
  135. [EditorBrowsable(EditorBrowsableState.Never)]
  136. public bool ShouldSerializeTransport()
  137. {
  138. return this.Transport.CredentialType != PeerTransportSecuritySettings.DefaultCredentialType;
  139. }
  140. }
  141. }