IssuedTokenServiceCredential.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System.Collections.Generic;
  7. using System.IdentityModel.Selectors;
  8. using System.IdentityModel.Tokens;
  9. using System.ServiceModel;
  10. using System.Security.Cryptography.X509Certificates;
  11. public class IssuedTokenServiceCredential
  12. {
  13. internal const bool DefaultAllowUntrustedRsaIssuers = false;
  14. internal const AudienceUriMode DefaultAudienceUriMode = AudienceUriMode.Always;
  15. internal const X509CertificateValidationMode DefaultCertificateValidationMode = X509CertificateValidationMode.ChainTrust;
  16. internal const X509RevocationMode DefaultRevocationMode = X509RevocationMode.Online;
  17. internal const StoreLocation DefaultTrustedStoreLocation = StoreLocation.LocalMachine;
  18. List<string> allowedAudienceUris;
  19. AudienceUriMode audienceUriMode = DefaultAudienceUriMode;
  20. List<X509Certificate2> knownCertificates;
  21. SamlSerializer samlSerializer;
  22. X509CertificateValidationMode certificateValidationMode = DefaultCertificateValidationMode;
  23. X509RevocationMode revocationMode = DefaultRevocationMode;
  24. StoreLocation trustedStoreLocation = DefaultTrustedStoreLocation;
  25. X509CertificateValidator customCertificateValidator = null;
  26. bool allowUntrustedRsaIssuers = DefaultAllowUntrustedRsaIssuers;
  27. bool isReadOnly;
  28. internal IssuedTokenServiceCredential()
  29. {
  30. this.allowedAudienceUris = new List<string>();
  31. this.knownCertificates = new List<X509Certificate2>();
  32. }
  33. internal IssuedTokenServiceCredential(IssuedTokenServiceCredential other)
  34. {
  35. this.audienceUriMode = other.audienceUriMode;
  36. this.allowedAudienceUris = new List<string>(other.allowedAudienceUris);
  37. this.samlSerializer = other.samlSerializer;
  38. this.knownCertificates = new List<X509Certificate2>(other.knownCertificates);
  39. this.certificateValidationMode = other.certificateValidationMode;
  40. this.customCertificateValidator = other.customCertificateValidator;
  41. this.trustedStoreLocation = other.trustedStoreLocation;
  42. this.revocationMode = other.revocationMode;
  43. this.allowUntrustedRsaIssuers = other.allowUntrustedRsaIssuers;
  44. this.isReadOnly = other.isReadOnly;
  45. }
  46. public IList<string> AllowedAudienceUris
  47. {
  48. get
  49. {
  50. if (this.isReadOnly)
  51. return this.allowedAudienceUris.AsReadOnly();
  52. else
  53. return this.allowedAudienceUris;
  54. }
  55. }
  56. public AudienceUriMode AudienceUriMode
  57. {
  58. get
  59. {
  60. return this.audienceUriMode;
  61. }
  62. set
  63. {
  64. ThrowIfImmutable();
  65. AudienceUriModeValidationHelper.Validate(audienceUriMode);
  66. this.audienceUriMode = value;
  67. }
  68. }
  69. public IList<X509Certificate2> KnownCertificates
  70. {
  71. get
  72. {
  73. if (this.isReadOnly)
  74. return this.knownCertificates.AsReadOnly();
  75. else
  76. return this.knownCertificates;
  77. }
  78. }
  79. public SamlSerializer SamlSerializer
  80. {
  81. get
  82. {
  83. return this.samlSerializer;
  84. }
  85. set
  86. {
  87. ThrowIfImmutable();
  88. this.samlSerializer = value;
  89. }
  90. }
  91. public X509CertificateValidationMode CertificateValidationMode
  92. {
  93. get
  94. {
  95. return this.certificateValidationMode;
  96. }
  97. set
  98. {
  99. X509CertificateValidationModeHelper.Validate(value);
  100. ThrowIfImmutable();
  101. this.certificateValidationMode = value;
  102. }
  103. }
  104. public X509RevocationMode RevocationMode
  105. {
  106. get
  107. {
  108. return this.revocationMode;
  109. }
  110. set
  111. {
  112. ThrowIfImmutable();
  113. this.revocationMode = value;
  114. }
  115. }
  116. public StoreLocation TrustedStoreLocation
  117. {
  118. get
  119. {
  120. return this.trustedStoreLocation;
  121. }
  122. set
  123. {
  124. ThrowIfImmutable();
  125. this.trustedStoreLocation = value;
  126. }
  127. }
  128. public X509CertificateValidator CustomCertificateValidator
  129. {
  130. get
  131. {
  132. return this.customCertificateValidator;
  133. }
  134. set
  135. {
  136. ThrowIfImmutable();
  137. this.customCertificateValidator = value;
  138. }
  139. }
  140. public bool AllowUntrustedRsaIssuers
  141. {
  142. get
  143. {
  144. return this.allowUntrustedRsaIssuers;
  145. }
  146. set
  147. {
  148. ThrowIfImmutable();
  149. this.allowUntrustedRsaIssuers = value;
  150. }
  151. }
  152. internal X509CertificateValidator GetCertificateValidator()
  153. {
  154. if (this.certificateValidationMode == X509CertificateValidationMode.None)
  155. {
  156. return X509CertificateValidator.None;
  157. }
  158. else if (this.certificateValidationMode == X509CertificateValidationMode.PeerTrust)
  159. {
  160. return X509CertificateValidator.PeerTrust;
  161. }
  162. else if (this.certificateValidationMode == X509CertificateValidationMode.Custom)
  163. {
  164. if (this.customCertificateValidator == null)
  165. {
  166. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MissingCustomCertificateValidator)));
  167. }
  168. return this.customCertificateValidator;
  169. }
  170. else
  171. {
  172. bool useMachineContext = this.trustedStoreLocation == StoreLocation.LocalMachine;
  173. X509ChainPolicy chainPolicy = new X509ChainPolicy();
  174. chainPolicy.RevocationMode = this.revocationMode;
  175. if (this.certificateValidationMode == X509CertificateValidationMode.ChainTrust)
  176. {
  177. return X509CertificateValidator.CreateChainTrustValidator(useMachineContext, chainPolicy);
  178. }
  179. else
  180. {
  181. return X509CertificateValidator.CreatePeerOrChainTrustValidator(useMachineContext, chainPolicy);
  182. }
  183. }
  184. }
  185. internal void MakeReadOnly()
  186. {
  187. this.isReadOnly = true;
  188. }
  189. void ThrowIfImmutable()
  190. {
  191. if (this.isReadOnly)
  192. {
  193. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ObjectIsReadOnly)));
  194. }
  195. }
  196. }
  197. }