SecurityElement.cs 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //------------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------------------------
  4. namespace System.ServiceModel.Configuration
  5. {
  6. using System.ComponentModel;
  7. using System.ServiceModel.Channels;
  8. using System.ServiceModel.Description;
  9. using System.Configuration;
  10. using System.Globalization;
  11. using System.Net.Security;
  12. using System.ServiceModel.Security;
  13. using System.ServiceModel.Security.Tokens;
  14. using System.Runtime.Remoting.Messaging;
  15. using System.Xml;
  16. using System.Collections.ObjectModel;
  17. using System.Collections.Generic;
  18. using System.IO;
  19. public sealed partial class SecurityElement : SecurityElementBase
  20. {
  21. public SecurityElement()
  22. {
  23. this.SecureConversationBootstrap.IsSecurityElementBootstrap = true; // Tell the bootstrap it's potentially okay to optimize itself out of config representation
  24. }
  25. [ConfigurationProperty(ConfigurationStrings.SecureConversationBootstrap)]
  26. public SecurityElementBase SecureConversationBootstrap
  27. {
  28. get { return (SecurityElementBase)base[ConfigurationStrings.SecureConversationBootstrap]; }
  29. }
  30. public override void CopyFrom(ServiceModelExtensionElement from)
  31. {
  32. base.CopyFrom(from);
  33. SecurityElement source = (SecurityElement)from;
  34. #pragma warning suppress 56506 //[....]; base.CopyFrom() checks for 'from' being null
  35. if (PropertyValueOrigin.Default != source.ElementInformation.Properties[ConfigurationStrings.SecureConversationBootstrap].ValueOrigin)
  36. this.SecureConversationBootstrap.CopyFrom(source.SecureConversationBootstrap);
  37. }
  38. protected internal override BindingElement CreateBindingElement(bool createTemplateOnly)
  39. {
  40. SecurityBindingElement result;
  41. if (this.AuthenticationMode == AuthenticationMode.SecureConversation)
  42. {
  43. if (this.SecureConversationBootstrap == null)
  44. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SecureConversationNeedsBootstrapSecurity)));
  45. if (this.SecureConversationBootstrap.AuthenticationMode == AuthenticationMode.SecureConversation)
  46. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SecureConversationBootstrapCannotUseSecureConversation)));
  47. SecurityBindingElement bootstrapSecurity = (SecurityBindingElement)this.SecureConversationBootstrap.CreateBindingElement(createTemplateOnly);
  48. result = SecurityBindingElement.CreateSecureConversationBindingElement(bootstrapSecurity, this.RequireSecurityContextCancellation);
  49. }
  50. else
  51. {
  52. result = (SecurityBindingElement)base.CreateBindingElement(createTemplateOnly);
  53. }
  54. this.ApplyConfiguration(result);
  55. return result;
  56. }
  57. protected override void AddBindingTemplates(Dictionary<AuthenticationMode, SecurityBindingElement> bindingTemplates)
  58. {
  59. base.AddBindingTemplates(bindingTemplates);
  60. AddBindingTemplate(bindingTemplates, AuthenticationMode.SecureConversation);
  61. }
  62. void InitializeSecureConversationParameters(SecureConversationSecurityTokenParameters sc, bool initializeNestedBindings)
  63. {
  64. SetPropertyValueIfNotDefaultValue(ConfigurationStrings.RequireSecurityContextCancellation, sc.RequireCancellation);
  65. this.CanRenewSecurityContextToken = sc.CanRenewSession; // can't use default value optimization here because ApplyConfiguration relies on the runtime default instead, which is the opposite of the config default
  66. if (sc.BootstrapSecurityBindingElement != null)
  67. {
  68. this.SecureConversationBootstrap.InitializeFrom(sc.BootstrapSecurityBindingElement, initializeNestedBindings);
  69. }
  70. }
  71. protected override void InitializeNestedTokenParameterSettings(SecurityTokenParameters sp, bool initializeNestedBindings)
  72. {
  73. if (sp is SecureConversationSecurityTokenParameters)
  74. this.InitializeSecureConversationParameters((SecureConversationSecurityTokenParameters)sp, initializeNestedBindings);
  75. else
  76. base.InitializeNestedTokenParameterSettings(sp, initializeNestedBindings);
  77. }
  78. }
  79. }