SecurityTokenParameters.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Security.Tokens
  5. {
  6. using System.ServiceModel.Security;
  7. using System.ServiceModel.Channels;
  8. using System.ServiceModel;
  9. using System.Text;
  10. using System.Globalization;
  11. using System.IdentityModel.Selectors;
  12. using System.IdentityModel.Tokens;
  13. public abstract class SecurityTokenParameters
  14. {
  15. internal const SecurityTokenInclusionMode defaultInclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
  16. internal const SecurityTokenReferenceStyle defaultReferenceStyle = SecurityTokenReferenceStyle.Internal;
  17. internal const bool defaultRequireDerivedKeys = true;
  18. SecurityTokenInclusionMode inclusionMode = defaultInclusionMode;
  19. SecurityTokenReferenceStyle referenceStyle = defaultReferenceStyle;
  20. bool requireDerivedKeys = defaultRequireDerivedKeys;
  21. protected SecurityTokenParameters(SecurityTokenParameters other)
  22. {
  23. if (other == null)
  24. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("other");
  25. this.requireDerivedKeys = other.requireDerivedKeys;
  26. this.inclusionMode = other.inclusionMode;
  27. this.referenceStyle = other.referenceStyle;
  28. }
  29. protected SecurityTokenParameters()
  30. {
  31. // empty
  32. }
  33. internal protected abstract bool HasAsymmetricKey { get; }
  34. public SecurityTokenInclusionMode InclusionMode
  35. {
  36. get
  37. {
  38. return this.inclusionMode;
  39. }
  40. set
  41. {
  42. SecurityTokenInclusionModeHelper.Validate(value);
  43. this.inclusionMode = value;
  44. }
  45. }
  46. public SecurityTokenReferenceStyle ReferenceStyle
  47. {
  48. get
  49. {
  50. return this.referenceStyle;
  51. }
  52. set
  53. {
  54. TokenReferenceStyleHelper.Validate(value);
  55. this.referenceStyle = value;
  56. }
  57. }
  58. public bool RequireDerivedKeys
  59. {
  60. get
  61. {
  62. return this.requireDerivedKeys;
  63. }
  64. set
  65. {
  66. this.requireDerivedKeys = value;
  67. }
  68. }
  69. internal protected abstract bool SupportsClientAuthentication { get; }
  70. internal protected abstract bool SupportsServerAuthentication { get; }
  71. internal protected abstract bool SupportsClientWindowsIdentity { get; }
  72. public SecurityTokenParameters Clone()
  73. {
  74. SecurityTokenParameters result = this.CloneCore();
  75. if (result == null)
  76. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SecurityTokenParametersCloneInvalidResult, this.GetType().ToString())));
  77. return result;
  78. }
  79. protected abstract SecurityTokenParameters CloneCore();
  80. internal protected abstract SecurityKeyIdentifierClause CreateKeyIdentifierClause(SecurityToken token, SecurityTokenReferenceStyle referenceStyle);
  81. internal protected abstract void InitializeSecurityTokenRequirement(SecurityTokenRequirement requirement);
  82. internal SecurityKeyIdentifierClause CreateKeyIdentifierClause<TExternalClause, TInternalClause>(SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
  83. where TExternalClause : SecurityKeyIdentifierClause
  84. where TInternalClause : SecurityKeyIdentifierClause
  85. {
  86. if (token == null)
  87. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  88. SecurityKeyIdentifierClause result;
  89. switch (referenceStyle)
  90. {
  91. default:
  92. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(
  93. SR.GetString(SR.TokenDoesNotSupportKeyIdentifierClauseCreation, token.GetType().Name, referenceStyle)));
  94. case SecurityTokenReferenceStyle.External:
  95. result = token.CreateKeyIdentifierClause<TExternalClause>();
  96. break;
  97. case SecurityTokenReferenceStyle.Internal:
  98. result = token.CreateKeyIdentifierClause<TInternalClause>();
  99. break;
  100. }
  101. return result;
  102. }
  103. internal SecurityKeyIdentifierClause CreateGenericXmlTokenKeyIdentifierClause(SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
  104. {
  105. GenericXmlSecurityToken xmlToken = token as GenericXmlSecurityToken;
  106. if (xmlToken != null)
  107. {
  108. if (referenceStyle == SecurityTokenReferenceStyle.Internal && xmlToken.InternalTokenReference != null)
  109. return xmlToken.InternalTokenReference;
  110. if (referenceStyle == SecurityTokenReferenceStyle.External && xmlToken.ExternalTokenReference != null)
  111. return xmlToken.ExternalTokenReference;
  112. }
  113. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.UnableToCreateTokenReference)));
  114. }
  115. internal protected virtual bool MatchesKeyIdentifierClause(SecurityToken token, SecurityKeyIdentifierClause keyIdentifierClause, SecurityTokenReferenceStyle referenceStyle)
  116. {
  117. if (token == null)
  118. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  119. if (token is GenericXmlSecurityToken)
  120. {
  121. return MatchesGenericXmlTokenKeyIdentifierClause(token, keyIdentifierClause, referenceStyle);
  122. }
  123. bool result;
  124. switch (referenceStyle)
  125. {
  126. default:
  127. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(
  128. SR.GetString(SR.TokenDoesNotSupportKeyIdentifierClauseCreation, token.GetType().Name, referenceStyle)));
  129. case SecurityTokenReferenceStyle.External:
  130. if (keyIdentifierClause is LocalIdKeyIdentifierClause)
  131. result = false;
  132. else
  133. result = token.MatchesKeyIdentifierClause(keyIdentifierClause);
  134. break;
  135. case SecurityTokenReferenceStyle.Internal:
  136. result = token.MatchesKeyIdentifierClause(keyIdentifierClause);
  137. break;
  138. }
  139. return result;
  140. }
  141. internal bool MatchesGenericXmlTokenKeyIdentifierClause(SecurityToken token, SecurityKeyIdentifierClause keyIdentifierClause, SecurityTokenReferenceStyle referenceStyle)
  142. {
  143. if (token == null)
  144. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  145. bool result;
  146. GenericXmlSecurityToken xmlToken = token as GenericXmlSecurityToken;
  147. if (xmlToken == null)
  148. result = false;
  149. else if (referenceStyle == SecurityTokenReferenceStyle.External && xmlToken.ExternalTokenReference != null)
  150. result = xmlToken.ExternalTokenReference.Matches(keyIdentifierClause);
  151. else if (referenceStyle == SecurityTokenReferenceStyle.Internal)
  152. result = xmlToken.MatchesKeyIdentifierClause(keyIdentifierClause);
  153. else
  154. result = false;
  155. return result;
  156. }
  157. public override string ToString()
  158. {
  159. StringBuilder sb = new StringBuilder();
  160. sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "{0}:", this.GetType().ToString()));
  161. sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "InclusionMode: {0}", this.inclusionMode.ToString()));
  162. sb.AppendLine(String.Format(CultureInfo.InvariantCulture, "ReferenceStyle: {0}", this.referenceStyle.ToString()));
  163. sb.Append(String.Format(CultureInfo.InvariantCulture, "RequireDerivedKeys: {0}", this.requireDerivedKeys.ToString()));
  164. return sb.ToString();
  165. }
  166. }
  167. }