IssuedTokenParametersElement.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. //------------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------------------------
  4. namespace System.ServiceModel.Configuration
  5. {
  6. using System;
  7. using System.Collections.ObjectModel;
  8. using System.ComponentModel;
  9. using System.Configuration;
  10. using System.IdentityModel.Tokens;
  11. using System.IO;
  12. using System.Runtime;
  13. using System.ServiceModel;
  14. using System.ServiceModel.Description;
  15. using System.ServiceModel.Security.Tokens;
  16. using System.Text;
  17. using System.Xml;
  18. public sealed partial class IssuedTokenParametersElement : ServiceModelConfigurationElement
  19. {
  20. Collection<IssuedTokenParametersElement> optionalIssuedTokenParameters = null;
  21. public IssuedTokenParametersElement()
  22. {
  23. }
  24. [ConfigurationProperty(ConfigurationStrings.DefaultMessageSecurityVersion)]
  25. [TypeConverter(typeof(MessageSecurityVersionConverter))]
  26. public MessageSecurityVersion DefaultMessageSecurityVersion
  27. {
  28. get { return (MessageSecurityVersion)base[ConfigurationStrings.DefaultMessageSecurityVersion]; }
  29. set { base[ConfigurationStrings.DefaultMessageSecurityVersion] = value; }
  30. }
  31. [ConfigurationProperty(ConfigurationStrings.AdditionalRequestParameters)]
  32. public XmlElementElementCollection AdditionalRequestParameters
  33. {
  34. get { return (XmlElementElementCollection)base[ConfigurationStrings.AdditionalRequestParameters]; }
  35. }
  36. [ConfigurationProperty(ConfigurationStrings.ClaimTypeRequirements)]
  37. public ClaimTypeElementCollection ClaimTypeRequirements
  38. {
  39. get { return (ClaimTypeElementCollection)base[ConfigurationStrings.ClaimTypeRequirements]; }
  40. }
  41. [ConfigurationProperty(ConfigurationStrings.Issuer)]
  42. public IssuedTokenParametersEndpointAddressElement Issuer
  43. {
  44. get { return (IssuedTokenParametersEndpointAddressElement)base[ConfigurationStrings.Issuer]; }
  45. }
  46. [ConfigurationProperty(ConfigurationStrings.IssuerMetadata)]
  47. public EndpointAddressElementBase IssuerMetadata
  48. {
  49. get { return (EndpointAddressElementBase)base[ConfigurationStrings.IssuerMetadata]; }
  50. }
  51. [ConfigurationProperty(ConfigurationStrings.KeySize, DefaultValue = 0)]
  52. [IntegerValidator(MinValue = 0)]
  53. public int KeySize
  54. {
  55. get { return (int)base[ConfigurationStrings.KeySize]; }
  56. set { base[ConfigurationStrings.KeySize] = value; }
  57. }
  58. [ConfigurationProperty(ConfigurationStrings.KeyType, DefaultValue = IssuedSecurityTokenParameters.defaultKeyType)]
  59. [ServiceModelEnumValidator(typeof(System.IdentityModel.Tokens.SecurityKeyTypeHelper))]
  60. public SecurityKeyType KeyType
  61. {
  62. get { return (SecurityKeyType)base[ConfigurationStrings.KeyType]; }
  63. set { base[ConfigurationStrings.KeyType] = value; }
  64. }
  65. internal Collection<IssuedTokenParametersElement> OptionalIssuedTokenParameters
  66. {
  67. get
  68. {
  69. // OptionalIssuedTokenParameters built on assumption that configuration is writable.
  70. // This should be protected at the callers site. If assumption is invalid, then
  71. // configuration system is in an indeterminate state. Need to stop in a manner that
  72. // user code can not capture.
  73. if (this.IsReadOnly())
  74. {
  75. Fx.Assert("IssuedTokenParametersElement.OptionalIssuedTokenParameters should only be called by Admin APIs");
  76. DiagnosticUtility.FailFast("IssuedTokenParametersElement.OptionalIssuedTokenParameters should only be called by Admin APIs");
  77. }
  78. // No need to worry about a race condition here-- this method is not meant to be called by multi-threaded
  79. // apps. It is only supposed to be called by svcutil and single threaded equivalents.
  80. if (this.optionalIssuedTokenParameters == null)
  81. {
  82. this.optionalIssuedTokenParameters = new Collection<IssuedTokenParametersElement>();
  83. }
  84. return this.optionalIssuedTokenParameters;
  85. }
  86. }
  87. [ConfigurationProperty(ConfigurationStrings.TokenType, DefaultValue = "")]
  88. [StringValidator(MinLength = 0)]
  89. public string TokenType
  90. {
  91. get { return (string)base[ConfigurationStrings.TokenType]; }
  92. set
  93. {
  94. if (String.IsNullOrEmpty(value))
  95. {
  96. value = String.Empty;
  97. }
  98. base[ConfigurationStrings.TokenType] = value;
  99. }
  100. }
  101. [ConfigurationProperty(ConfigurationStrings.UseStrTransform, DefaultValue = false)]
  102. public bool UseStrTransform
  103. {
  104. get { return (bool)base[ConfigurationStrings.UseStrTransform]; }
  105. set { base[ConfigurationStrings.UseStrTransform] = value; }
  106. }
  107. internal void ApplyConfiguration(IssuedSecurityTokenParameters parameters)
  108. {
  109. if (parameters == null)
  110. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("parameters"));
  111. if (this.AdditionalRequestParameters != null)
  112. {
  113. foreach (XmlElementElement e in this.AdditionalRequestParameters)
  114. {
  115. parameters.AdditionalRequestParameters.Add(e.XmlElement);
  116. }
  117. }
  118. if (this.ClaimTypeRequirements != null)
  119. {
  120. foreach (ClaimTypeElement c in this.ClaimTypeRequirements)
  121. {
  122. parameters.ClaimTypeRequirements.Add(new ClaimTypeRequirement(c.ClaimType, c.IsOptional));
  123. }
  124. }
  125. parameters.KeySize = this.KeySize;
  126. parameters.KeyType = this.KeyType;
  127. parameters.DefaultMessageSecurityVersion = this.DefaultMessageSecurityVersion;
  128. parameters.UseStrTransform = this.UseStrTransform;
  129. if (!string.IsNullOrEmpty(this.TokenType))
  130. {
  131. parameters.TokenType = this.TokenType;
  132. }
  133. if (PropertyValueOrigin.Default != this.ElementInformation.Properties[ConfigurationStrings.Issuer].ValueOrigin)
  134. {
  135. this.Issuer.Validate();
  136. parameters.IssuerAddress = ConfigLoader.LoadEndpointAddress(this.Issuer);
  137. if (!string.IsNullOrEmpty(this.Issuer.Binding))
  138. {
  139. parameters.IssuerBinding = ConfigLoader.LookupBinding(this.Issuer.Binding, this.Issuer.BindingConfiguration, this.EvaluationContext);
  140. }
  141. }
  142. if (PropertyValueOrigin.Default != this.ElementInformation.Properties[ConfigurationStrings.IssuerMetadata].ValueOrigin)
  143. {
  144. parameters.IssuerMetadataAddress = ConfigLoader.LoadEndpointAddress(this.IssuerMetadata);
  145. }
  146. }
  147. internal void Copy(IssuedTokenParametersElement source)
  148. {
  149. if (this.IsReadOnly())
  150. {
  151. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(SR.GetString(SR.ConfigReadOnly)));
  152. }
  153. if (null == source)
  154. {
  155. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("source");
  156. }
  157. foreach (XmlElementElement xmlElement in source.AdditionalRequestParameters)
  158. {
  159. XmlElementElement newElement = new XmlElementElement();
  160. newElement.Copy(xmlElement);
  161. this.AdditionalRequestParameters.Add(newElement);
  162. }
  163. foreach (ClaimTypeElement c in source.ClaimTypeRequirements)
  164. {
  165. this.ClaimTypeRequirements.Add(new ClaimTypeElement(c.ClaimType, c.IsOptional));
  166. }
  167. this.KeySize = source.KeySize;
  168. this.KeyType = source.KeyType;
  169. this.TokenType = source.TokenType;
  170. this.DefaultMessageSecurityVersion = source.DefaultMessageSecurityVersion;
  171. this.UseStrTransform = source.UseStrTransform;
  172. if (PropertyValueOrigin.Default != source.ElementInformation.Properties[ConfigurationStrings.Issuer].ValueOrigin)
  173. {
  174. this.Issuer.Copy(source.Issuer);
  175. }
  176. if (PropertyValueOrigin.Default != source.ElementInformation.Properties[ConfigurationStrings.IssuerMetadata].ValueOrigin)
  177. {
  178. this.IssuerMetadata.Copy(source.IssuerMetadata);
  179. }
  180. }
  181. internal IssuedSecurityTokenParameters Create(bool createTemplateOnly, SecurityKeyType templateKeyType)
  182. {
  183. IssuedSecurityTokenParameters result = new IssuedSecurityTokenParameters();
  184. if (!createTemplateOnly)
  185. {
  186. this.ApplyConfiguration(result);
  187. }
  188. else
  189. {
  190. result.KeyType = templateKeyType;
  191. }
  192. return result;
  193. }
  194. internal void InitializeFrom(IssuedSecurityTokenParameters source, bool initializeNestedBindings)
  195. {
  196. if (null == source)
  197. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("source");
  198. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.KeyType, source.KeyType);
  199. if (source.KeySize > 0)
  200. {
  201. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.KeySize, source.KeySize);
  202. }
  203. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.TokenType, source.TokenType);
  204. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.UseStrTransform, source.UseStrTransform);
  205. if (source.IssuerAddress != null)
  206. this.Issuer.InitializeFrom(source.IssuerAddress);
  207. if (source.DefaultMessageSecurityVersion != null)
  208. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.DefaultMessageSecurityVersion, source.DefaultMessageSecurityVersion);
  209. if (source.IssuerBinding != null && initializeNestedBindings)
  210. {
  211. this.Issuer.BindingConfiguration = this.Issuer.Address.ToString();
  212. string bindingSectionName;
  213. BindingsSection.TryAdd(this.Issuer.BindingConfiguration,
  214. source.IssuerBinding,
  215. out bindingSectionName);
  216. this.Issuer.Binding = bindingSectionName;
  217. }
  218. if (source.IssuerMetadataAddress != null)
  219. {
  220. this.IssuerMetadata.InitializeFrom(source.IssuerMetadataAddress);
  221. }
  222. foreach (XmlElement element in source.AdditionalRequestParameters)
  223. {
  224. this.AdditionalRequestParameters.Add(new XmlElementElement(element));
  225. }
  226. foreach (ClaimTypeRequirement c in source.ClaimTypeRequirements)
  227. {
  228. this.ClaimTypeRequirements.Add(new ClaimTypeElement(c.ClaimType, c.IsOptional));
  229. }
  230. foreach (IssuedSecurityTokenParameters.AlternativeIssuerEndpoint alternativeIssuer in source.AlternativeIssuerEndpoints)
  231. {
  232. IssuedTokenParametersElement element = new IssuedTokenParametersElement();
  233. element.Issuer.InitializeFrom(alternativeIssuer.IssuerAddress);
  234. if (initializeNestedBindings)
  235. {
  236. element.Issuer.BindingConfiguration = element.Issuer.Address.ToString();
  237. string bindingSectionName;
  238. BindingsSection.TryAdd(element.Issuer.BindingConfiguration,
  239. alternativeIssuer.IssuerBinding,
  240. out bindingSectionName);
  241. element.Issuer.Binding = bindingSectionName;
  242. }
  243. this.OptionalIssuedTokenParameters.Add(element);
  244. }
  245. }
  246. protected override bool SerializeToXmlElement(XmlWriter writer, String elementName)
  247. {
  248. bool writeMe = base.SerializeToXmlElement(writer, elementName);
  249. bool writeComment = this.OptionalIssuedTokenParameters.Count > 0;
  250. if (writeComment && writer != null)
  251. {
  252. MemoryStream memoryStream = new MemoryStream();
  253. using (XmlTextWriter commentWriter = new XmlTextWriter(memoryStream, Encoding.UTF8))
  254. {
  255. commentWriter.Formatting = Formatting.Indented;
  256. commentWriter.WriteStartElement(ConfigurationStrings.AlternativeIssuedTokenParameters);
  257. foreach (IssuedTokenParametersElement element in this.OptionalIssuedTokenParameters)
  258. {
  259. element.SerializeToXmlElement(commentWriter, ConfigurationStrings.IssuedTokenParameters);
  260. }
  261. commentWriter.WriteEndElement();
  262. commentWriter.Flush();
  263. string commentString = new UTF8Encoding().GetString(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
  264. writer.WriteComment(commentString.Substring(1, commentString.Length - 1));
  265. commentWriter.Close();
  266. }
  267. }
  268. return writeMe || writeComment;
  269. }
  270. protected override void Unmerge(ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode saveMode)
  271. {
  272. if (sourceElement is IssuedTokenParametersElement)
  273. {
  274. IssuedTokenParametersElement source = (IssuedTokenParametersElement)sourceElement;
  275. this.optionalIssuedTokenParameters = source.optionalIssuedTokenParameters;
  276. }
  277. base.Unmerge(sourceElement, parentElement, saveMode);
  278. }
  279. }
  280. }