SecureConversationSecurityTokenParameters.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Security.Tokens
  5. {
  6. using System.IdentityModel.Tokens;
  7. using System.ServiceModel.Channels;
  8. using System.IdentityModel.Selectors;
  9. using System.ServiceModel;
  10. using System.ServiceModel.Security;
  11. using System.Text;
  12. using System.Globalization;
  13. public class SecureConversationSecurityTokenParameters : SecurityTokenParameters
  14. {
  15. internal const bool defaultRequireCancellation = true;
  16. internal const bool defaultCanRenewSession = true;
  17. SecurityBindingElement bootstrapSecurityBindingElement;
  18. ChannelProtectionRequirements bootstrapProtectionRequirements;
  19. bool requireCancellation;
  20. bool canRenewSession = defaultCanRenewSession;
  21. BindingContext issuerBindingContext;
  22. protected SecureConversationSecurityTokenParameters(SecureConversationSecurityTokenParameters other)
  23. : base(other)
  24. {
  25. this.requireCancellation = other.requireCancellation;
  26. this.canRenewSession = other.canRenewSession;
  27. if (other.bootstrapSecurityBindingElement != null)
  28. this.bootstrapSecurityBindingElement = (SecurityBindingElement)other.bootstrapSecurityBindingElement.Clone();
  29. if (other.bootstrapProtectionRequirements != null)
  30. this.bootstrapProtectionRequirements = new ChannelProtectionRequirements(other.bootstrapProtectionRequirements);
  31. if (other.issuerBindingContext != null)
  32. this.issuerBindingContext = other.issuerBindingContext.Clone();
  33. }
  34. public SecureConversationSecurityTokenParameters()
  35. : this(null, defaultRequireCancellation, null)
  36. {
  37. // empty
  38. }
  39. public SecureConversationSecurityTokenParameters(SecurityBindingElement bootstrapSecurityBindingElement)
  40. : this(bootstrapSecurityBindingElement, defaultRequireCancellation, null)
  41. {
  42. // empty
  43. }
  44. public SecureConversationSecurityTokenParameters(SecurityBindingElement bootstrapSecurityBindingElement, bool requireCancellation)
  45. : this(bootstrapSecurityBindingElement, requireCancellation, true)
  46. {
  47. // empty
  48. }
  49. public SecureConversationSecurityTokenParameters(SecurityBindingElement bootstrapSecurityBindingElement, bool requireCancellation, bool canRenewSession)
  50. : this(bootstrapSecurityBindingElement, requireCancellation, canRenewSession, null)
  51. {
  52. // empty
  53. }
  54. public SecureConversationSecurityTokenParameters(SecurityBindingElement bootstrapSecurityBindingElement, bool requireCancellation, ChannelProtectionRequirements bootstrapProtectionRequirements)
  55. : this(bootstrapSecurityBindingElement, requireCancellation, defaultCanRenewSession, null)
  56. {
  57. // empty
  58. }
  59. public SecureConversationSecurityTokenParameters(SecurityBindingElement bootstrapSecurityBindingElement, bool requireCancellation, bool canRenewSession, ChannelProtectionRequirements bootstrapProtectionRequirements)
  60. : base()
  61. {
  62. this.bootstrapSecurityBindingElement = bootstrapSecurityBindingElement;
  63. this.canRenewSession = canRenewSession;
  64. if (bootstrapProtectionRequirements != null)
  65. this.bootstrapProtectionRequirements = new ChannelProtectionRequirements(bootstrapProtectionRequirements);
  66. else
  67. {
  68. this.bootstrapProtectionRequirements = new ChannelProtectionRequirements();
  69. this.bootstrapProtectionRequirements.IncomingEncryptionParts.AddParts(new MessagePartSpecification(true));
  70. this.bootstrapProtectionRequirements.IncomingSignatureParts.AddParts(new MessagePartSpecification(true));
  71. this.bootstrapProtectionRequirements.OutgoingEncryptionParts.AddParts(new MessagePartSpecification(true));
  72. this.bootstrapProtectionRequirements.OutgoingSignatureParts.AddParts(new MessagePartSpecification(true));
  73. }
  74. this.requireCancellation = requireCancellation;
  75. }
  76. internal protected override bool HasAsymmetricKey { get { return false; } }
  77. public SecurityBindingElement BootstrapSecurityBindingElement
  78. {
  79. get
  80. {
  81. return this.bootstrapSecurityBindingElement;
  82. }
  83. set
  84. {
  85. this.bootstrapSecurityBindingElement = value;
  86. }
  87. }
  88. public ChannelProtectionRequirements BootstrapProtectionRequirements
  89. {
  90. get
  91. {
  92. return this.bootstrapProtectionRequirements;
  93. }
  94. }
  95. internal BindingContext IssuerBindingContext
  96. {
  97. get
  98. {
  99. return this.issuerBindingContext;
  100. }
  101. set
  102. {
  103. if (value != null)
  104. {
  105. value = value.Clone();
  106. }
  107. this.issuerBindingContext = value;
  108. }
  109. }
  110. ISecurityCapabilities BootstrapSecurityCapabilities
  111. {
  112. get
  113. {
  114. return this.bootstrapSecurityBindingElement.GetIndividualProperty<ISecurityCapabilities>();
  115. }
  116. }
  117. public bool RequireCancellation
  118. {
  119. get
  120. {
  121. return this.requireCancellation;
  122. }
  123. set
  124. {
  125. this.requireCancellation = value;
  126. }
  127. }
  128. public bool CanRenewSession
  129. {
  130. get
  131. {
  132. return this.canRenewSession;
  133. }
  134. set
  135. {
  136. this.canRenewSession = value;
  137. }
  138. }
  139. internal protected override bool SupportsClientAuthentication
  140. {
  141. get
  142. {
  143. return this.BootstrapSecurityCapabilities == null ? false : this.BootstrapSecurityCapabilities.SupportsClientAuthentication;
  144. }
  145. }
  146. internal protected override bool SupportsServerAuthentication
  147. {
  148. get
  149. {
  150. return this.BootstrapSecurityCapabilities == null ? false : this.BootstrapSecurityCapabilities.SupportsServerAuthentication;
  151. }
  152. }
  153. internal protected override bool SupportsClientWindowsIdentity
  154. {
  155. get
  156. {
  157. return this.BootstrapSecurityCapabilities == null ? false : this.BootstrapSecurityCapabilities.SupportsClientWindowsIdentity;
  158. }
  159. }
  160. protected override SecurityTokenParameters CloneCore()
  161. {
  162. return new SecureConversationSecurityTokenParameters(this);
  163. }
  164. internal protected override SecurityKeyIdentifierClause CreateKeyIdentifierClause(SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
  165. {
  166. if (token is GenericXmlSecurityToken)
  167. return base.CreateGenericXmlTokenKeyIdentifierClause(token, referenceStyle);
  168. else
  169. return this.CreateKeyIdentifierClause<SecurityContextKeyIdentifierClause, LocalIdKeyIdentifierClause>(token, referenceStyle);
  170. }
  171. protected internal override void InitializeSecurityTokenRequirement(SecurityTokenRequirement requirement)
  172. {
  173. requirement.TokenType = ServiceModelSecurityTokenTypes.SecureConversation;
  174. requirement.KeyType = SecurityKeyType.SymmetricKey;
  175. requirement.RequireCryptographicToken = true;
  176. requirement.Properties[ServiceModelSecurityTokenRequirement.SupportSecurityContextCancellationProperty] = this.RequireCancellation;
  177. requirement.Properties[ServiceModelSecurityTokenRequirement.SecureConversationSecurityBindingElementProperty] = this.BootstrapSecurityBindingElement;
  178. requirement.Properties[ServiceModelSecurityTokenRequirement.IssuerBindingContextProperty] = this.IssuerBindingContext.Clone();
  179. requirement.Properties[ServiceModelSecurityTokenRequirement.IssuedSecurityTokenParametersProperty] = this.Clone();
  180. }
  181. public override string ToString()
  182. {
  183. StringBuilder sb = new StringBuilder();
  184. sb.AppendLine(base.ToString());
  185. sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "RequireCancellation: {0}", this.requireCancellation.ToString()));
  186. if (this.bootstrapSecurityBindingElement == null)
  187. {
  188. sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "BootstrapSecurityBindingElement: null"));
  189. }
  190. else
  191. {
  192. sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "BootstrapSecurityBindingElement:"));
  193. sb.AppendLine(" " + this.BootstrapSecurityBindingElement.ToString().Trim().Replace("\n", "\n "));
  194. }
  195. return sb.ToString().Trim();
  196. }
  197. }
  198. }