X509ServiceCertificateAuthentication.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System.IdentityModel.Selectors;
  7. using System.Runtime;
  8. using System.Security.Cryptography.X509Certificates;
  9. using System.ServiceModel;
  10. public sealed class X509ServiceCertificateAuthentication
  11. {
  12. internal const X509CertificateValidationMode DefaultCertificateValidationMode = X509CertificateValidationMode.ChainTrust;
  13. internal const X509RevocationMode DefaultRevocationMode = X509RevocationMode.Online;
  14. internal const StoreLocation DefaultTrustedStoreLocation = StoreLocation.CurrentUser;
  15. static X509CertificateValidator defaultCertificateValidator;
  16. X509CertificateValidationMode certificateValidationMode = DefaultCertificateValidationMode;
  17. X509RevocationMode revocationMode = DefaultRevocationMode;
  18. StoreLocation trustedStoreLocation = DefaultTrustedStoreLocation;
  19. X509CertificateValidator customCertificateValidator = null;
  20. bool isReadOnly;
  21. public X509ServiceCertificateAuthentication()
  22. {
  23. }
  24. internal X509ServiceCertificateAuthentication(X509ServiceCertificateAuthentication other)
  25. {
  26. this.certificateValidationMode = other.certificateValidationMode;
  27. this.customCertificateValidator = other.customCertificateValidator;
  28. this.revocationMode = other.revocationMode;
  29. this.trustedStoreLocation = other.trustedStoreLocation;
  30. this.isReadOnly = other.isReadOnly;
  31. }
  32. internal static X509CertificateValidator DefaultCertificateValidator
  33. {
  34. get
  35. {
  36. if (defaultCertificateValidator == null)
  37. {
  38. bool useMachineContext = DefaultTrustedStoreLocation == StoreLocation.LocalMachine;
  39. X509ChainPolicy chainPolicy = new X509ChainPolicy();
  40. chainPolicy.RevocationMode = DefaultRevocationMode;
  41. defaultCertificateValidator = X509CertificateValidator.CreateChainTrustValidator(useMachineContext, chainPolicy);
  42. }
  43. return defaultCertificateValidator;
  44. }
  45. }
  46. public X509CertificateValidationMode CertificateValidationMode
  47. {
  48. get
  49. {
  50. return this.certificateValidationMode;
  51. }
  52. set
  53. {
  54. X509CertificateValidationModeHelper.Validate(value);
  55. ThrowIfImmutable();
  56. this.certificateValidationMode = value;
  57. }
  58. }
  59. public X509RevocationMode RevocationMode
  60. {
  61. get
  62. {
  63. return this.revocationMode;
  64. }
  65. set
  66. {
  67. ThrowIfImmutable();
  68. this.revocationMode = value;
  69. }
  70. }
  71. public StoreLocation TrustedStoreLocation
  72. {
  73. get
  74. {
  75. return this.trustedStoreLocation;
  76. }
  77. set
  78. {
  79. ThrowIfImmutable();
  80. this.trustedStoreLocation = value;
  81. }
  82. }
  83. public X509CertificateValidator CustomCertificateValidator
  84. {
  85. get
  86. {
  87. return this.customCertificateValidator;
  88. }
  89. set
  90. {
  91. ThrowIfImmutable();
  92. this.customCertificateValidator = value;
  93. }
  94. }
  95. internal bool TryGetCertificateValidator(out X509CertificateValidator validator)
  96. {
  97. validator = null;
  98. if (this.certificateValidationMode == X509CertificateValidationMode.None)
  99. {
  100. validator = X509CertificateValidator.None;
  101. }
  102. else if (this.certificateValidationMode == X509CertificateValidationMode.PeerTrust)
  103. {
  104. validator = X509CertificateValidator.PeerTrust;
  105. }
  106. else if (this.certificateValidationMode == X509CertificateValidationMode.Custom)
  107. {
  108. validator = this.customCertificateValidator;
  109. }
  110. else
  111. {
  112. bool useMachineContext = this.trustedStoreLocation == StoreLocation.LocalMachine;
  113. X509ChainPolicy chainPolicy = new X509ChainPolicy();
  114. chainPolicy.RevocationMode = this.revocationMode;
  115. if (this.certificateValidationMode == X509CertificateValidationMode.ChainTrust)
  116. {
  117. validator = X509CertificateValidator.CreateChainTrustValidator(useMachineContext, chainPolicy);
  118. }
  119. else
  120. {
  121. validator = X509CertificateValidator.CreatePeerOrChainTrustValidator(useMachineContext, chainPolicy);
  122. }
  123. }
  124. return (validator != null);
  125. }
  126. internal X509CertificateValidator GetCertificateValidator()
  127. {
  128. X509CertificateValidator result;
  129. if (!TryGetCertificateValidator(out result))
  130. {
  131. Fx.Assert(this.customCertificateValidator == null, "");
  132. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MissingCustomCertificateValidator)));
  133. }
  134. return result;
  135. }
  136. internal void MakeReadOnly()
  137. {
  138. this.isReadOnly = true;
  139. }
  140. void ThrowIfImmutable()
  141. {
  142. if (this.isReadOnly)
  143. {
  144. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ObjectIsReadOnly)));
  145. }
  146. }
  147. }
  148. }