FederatedMessageSecurityOverHttpElement.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. //------------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------------------------
  4. namespace System.ServiceModel.Configuration
  5. {
  6. using System.Configuration;
  7. using System.ServiceModel.Channels;
  8. using System.ServiceModel.Description;
  9. using System.Globalization;
  10. using System.Net;
  11. using System.Net.Security;
  12. using System.ServiceModel;
  13. using System.ServiceModel.Security;
  14. using System.ServiceModel.Security.Tokens;
  15. using System.IdentityModel.Tokens;
  16. using System.ComponentModel;
  17. using System.Xml;
  18. public sealed partial class FederatedMessageSecurityOverHttpElement : ServiceModelConfigurationElement
  19. {
  20. [ConfigurationProperty(ConfigurationStrings.AlgorithmSuite, DefaultValue = ConfigurationStrings.Default)]
  21. [TypeConverter(typeof(SecurityAlgorithmSuiteConverter))]
  22. public SecurityAlgorithmSuite AlgorithmSuite
  23. {
  24. get { return (SecurityAlgorithmSuite)base[ConfigurationStrings.AlgorithmSuite]; }
  25. set { base[ConfigurationStrings.AlgorithmSuite] = value; }
  26. }
  27. [ConfigurationProperty(ConfigurationStrings.ClaimTypeRequirements)]
  28. public ClaimTypeElementCollection ClaimTypeRequirements
  29. {
  30. get { return (ClaimTypeElementCollection)base[ConfigurationStrings.ClaimTypeRequirements]; }
  31. }
  32. [ConfigurationProperty(ConfigurationStrings.EstablishSecurityContext, DefaultValue = FederatedMessageSecurityOverHttp.DefaultEstablishSecurityContext)]
  33. public bool EstablishSecurityContext
  34. {
  35. get { return (bool)base[ConfigurationStrings.EstablishSecurityContext]; }
  36. set { base[ConfigurationStrings.EstablishSecurityContext] = value; }
  37. }
  38. [ConfigurationProperty(ConfigurationStrings.IssuedKeyType, DefaultValue = FederatedMessageSecurityOverHttp.DefaultIssuedKeyType)]
  39. [ServiceModelEnumValidator(typeof(System.IdentityModel.Tokens.SecurityKeyTypeHelper))]
  40. public SecurityKeyType IssuedKeyType
  41. {
  42. get { return (SecurityKeyType)base[ConfigurationStrings.IssuedKeyType]; }
  43. set { base[ConfigurationStrings.IssuedKeyType] = value; }
  44. }
  45. [ConfigurationProperty(ConfigurationStrings.IssuedTokenType, DefaultValue = "")]
  46. [StringValidator(MinLength = 0)]
  47. public string IssuedTokenType
  48. {
  49. get { return (string)base[ConfigurationStrings.IssuedTokenType]; }
  50. set
  51. {
  52. if (String.IsNullOrEmpty(value))
  53. {
  54. value = string.Empty;
  55. }
  56. base[ConfigurationStrings.IssuedTokenType] = value;
  57. }
  58. }
  59. [ConfigurationProperty(ConfigurationStrings.Issuer)]
  60. public IssuedTokenParametersEndpointAddressElement Issuer
  61. {
  62. get { return (IssuedTokenParametersEndpointAddressElement)base[ConfigurationStrings.Issuer]; }
  63. }
  64. [ConfigurationProperty(ConfigurationStrings.IssuerMetadata)]
  65. public EndpointAddressElementBase IssuerMetadata
  66. {
  67. get { return (EndpointAddressElementBase)base[ConfigurationStrings.IssuerMetadata]; }
  68. }
  69. [ConfigurationProperty(ConfigurationStrings.NegotiateServiceCredential, DefaultValue = MessageSecurityOverHttp.DefaultNegotiateServiceCredential)]
  70. public bool NegotiateServiceCredential
  71. {
  72. get { return (bool)base[ConfigurationStrings.NegotiateServiceCredential]; }
  73. set { base[ConfigurationStrings.NegotiateServiceCredential] = value; }
  74. }
  75. [ConfigurationProperty(ConfigurationStrings.TokenRequestParameters)]
  76. public XmlElementElementCollection TokenRequestParameters
  77. {
  78. get { return (XmlElementElementCollection)base[ConfigurationStrings.TokenRequestParameters]; }
  79. }
  80. internal void ApplyConfiguration(FederatedMessageSecurityOverHttp security)
  81. {
  82. if (security == null)
  83. {
  84. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("security");
  85. }
  86. security.NegotiateServiceCredential = this.NegotiateServiceCredential;
  87. security.AlgorithmSuite = this.AlgorithmSuite;
  88. security.IssuedKeyType = this.IssuedKeyType;
  89. security.EstablishSecurityContext = this.EstablishSecurityContext;
  90. if (!string.IsNullOrEmpty(this.IssuedTokenType))
  91. {
  92. security.IssuedTokenType = this.IssuedTokenType;
  93. }
  94. if (PropertyValueOrigin.Default != this.ElementInformation.Properties[ConfigurationStrings.Issuer].ValueOrigin)
  95. {
  96. security.IssuerAddress = ConfigLoader.LoadEndpointAddress(this.Issuer);
  97. if (!string.IsNullOrEmpty(this.Issuer.Binding))
  98. {
  99. security.IssuerBinding = ConfigLoader.LookupBinding(this.Issuer.Binding, this.Issuer.BindingConfiguration, this.EvaluationContext);
  100. }
  101. }
  102. if (PropertyValueOrigin.Default != this.ElementInformation.Properties[ConfigurationStrings.IssuerMetadata].ValueOrigin)
  103. {
  104. security.IssuerMetadataAddress = ConfigLoader.LoadEndpointAddress(this.IssuerMetadata);
  105. }
  106. foreach (XmlElementElement xmlElement in this.TokenRequestParameters)
  107. {
  108. security.TokenRequestParameters.Add(xmlElement.XmlElement);
  109. }
  110. foreach (ClaimTypeElement claimType in this.ClaimTypeRequirements)
  111. {
  112. security.ClaimTypeRequirements.Add(new ClaimTypeRequirement(claimType.ClaimType, claimType.IsOptional));
  113. }
  114. }
  115. internal void InitializeFrom(FederatedMessageSecurityOverHttp security)
  116. {
  117. if (security == null)
  118. {
  119. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("security");
  120. }
  121. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.NegotiateServiceCredential, security.NegotiateServiceCredential);
  122. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.AlgorithmSuite, security.AlgorithmSuite);
  123. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.IssuedKeyType, security.IssuedKeyType);
  124. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.EstablishSecurityContext, security.EstablishSecurityContext);
  125. if (security.IssuedTokenType != null)
  126. {
  127. this.IssuedTokenType = security.IssuedTokenType;
  128. }
  129. if (security.IssuerAddress != null)
  130. {
  131. this.Issuer.InitializeFrom(security.IssuerAddress);
  132. }
  133. if (security.IssuerMetadataAddress != null)
  134. {
  135. this.IssuerMetadata.InitializeFrom(security.IssuerMetadataAddress);
  136. }
  137. string bindingType = null;
  138. if (security.IssuerBinding != null)
  139. {
  140. if (null == this.Issuer.Address)
  141. {
  142. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(SR.GetString(SR.ConfigNullIssuerAddress)));
  143. }
  144. this.Issuer.BindingConfiguration = this.Issuer.Address.ToString();
  145. BindingsSection.TryAdd(this.Issuer.BindingConfiguration,
  146. security.IssuerBinding, out bindingType);
  147. this.Issuer.Binding = bindingType;
  148. }
  149. foreach (XmlElement element in security.TokenRequestParameters)
  150. {
  151. this.TokenRequestParameters.Add(new XmlElementElement(element));
  152. }
  153. foreach (ClaimTypeRequirement claimTypeRequirement in security.ClaimTypeRequirements)
  154. {
  155. ClaimTypeElement element = new ClaimTypeElement(claimTypeRequirement.ClaimType, claimTypeRequirement.IsOptional);
  156. this.ClaimTypeRequirements.Add(element);
  157. }
  158. }
  159. }
  160. }