ServiceCredentialsSecurityTokenManager.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System.Collections.Generic;
  7. using System.Collections.ObjectModel;
  8. using System.IdentityModel.Policy;
  9. using System.IdentityModel.Selectors;
  10. using System.IdentityModel.Tokens;
  11. using System.Net;
  12. using System.Security.Authentication.ExtendedProtection;
  13. using System.ServiceModel;
  14. using System.ServiceModel.Channels;
  15. using System.ServiceModel.Description;
  16. using System.ServiceModel.Dispatcher;
  17. using System.ServiceModel.Security.Tokens;
  18. public class ServiceCredentialsSecurityTokenManager : SecurityTokenManager, IEndpointIdentityProvider
  19. {
  20. ServiceCredentials parent;
  21. public ServiceCredentialsSecurityTokenManager(ServiceCredentials parent)
  22. {
  23. if (parent == null)
  24. {
  25. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("parent");
  26. }
  27. this.parent = parent;
  28. }
  29. public ServiceCredentials ServiceCredentials
  30. {
  31. get { return parent; }
  32. }
  33. public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
  34. {
  35. if (version == null)
  36. {
  37. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("version");
  38. }
  39. MessageSecurityTokenVersion wsVersion = version as MessageSecurityTokenVersion;
  40. if (wsVersion != null)
  41. {
  42. SamlSerializer samlSerializer = null;
  43. if (parent.IssuedTokenAuthentication != null)
  44. samlSerializer = parent.IssuedTokenAuthentication.SamlSerializer;
  45. else
  46. samlSerializer = new SamlSerializer();
  47. return new WSSecurityTokenSerializer(wsVersion.SecurityVersion, wsVersion.TrustVersion, wsVersion.SecureConversationVersion, wsVersion.EmitBspRequiredAttributes, samlSerializer, parent.SecureConversationAuthentication.SecurityStateEncoder, parent.SecureConversationAuthentication.SecurityContextClaimTypes);
  48. }
  49. else
  50. {
  51. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.GetString(SR.SecurityTokenManagerCannotCreateSerializerForVersion, version)));
  52. }
  53. }
  54. protected SecurityTokenAuthenticator CreateSecureConversationTokenAuthenticator(RecipientServiceModelSecurityTokenRequirement recipientRequirement, bool preserveBootstrapTokens, out SecurityTokenResolver sctResolver)
  55. {
  56. SecurityBindingElement securityBindingElement = recipientRequirement.SecurityBindingElement;
  57. if (securityBindingElement == null)
  58. {
  59. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.TokenAuthenticatorRequiresSecurityBindingElement, recipientRequirement));
  60. }
  61. bool isCookieMode = !recipientRequirement.SupportSecurityContextCancellation;
  62. LocalServiceSecuritySettings localServiceSettings = securityBindingElement.LocalServiceSettings;
  63. IMessageFilterTable<EndpointAddress> endpointFilterTable = recipientRequirement.GetPropertyOrDefault<IMessageFilterTable<EndpointAddress>>(ServiceModelSecurityTokenRequirement.EndpointFilterTableProperty, null);
  64. if (!isCookieMode)
  65. {
  66. sctResolver = new SecurityContextSecurityTokenResolver(Int32.MaxValue, false);
  67. // remember this authenticator for future reference
  68. SecuritySessionSecurityTokenAuthenticator authenticator = new SecuritySessionSecurityTokenAuthenticator();
  69. authenticator.BootstrapSecurityBindingElement = SecurityUtils.GetIssuerSecurityBindingElement(recipientRequirement);
  70. authenticator.IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>(ServiceModelSecurityTokenRequirement.IssuedSecurityTokenParametersProperty);
  71. authenticator.IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver;
  72. authenticator.IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecurityTokenRequirement.IssuerBindingContextProperty);
  73. authenticator.KeyEntropyMode = securityBindingElement.KeyEntropyMode;
  74. authenticator.ListenUri = recipientRequirement.ListenUri;
  75. authenticator.SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite;
  76. authenticator.SessionTokenLifetime = TimeSpan.MaxValue;
  77. authenticator.KeyRenewalInterval = securityBindingElement.LocalServiceSettings.SessionKeyRenewalInterval;
  78. authenticator.StandardsManager = SecurityUtils.CreateSecurityStandardsManager(recipientRequirement, this);
  79. authenticator.EndpointFilterTable = endpointFilterTable;
  80. authenticator.MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations;
  81. authenticator.NegotiationTimeout = localServiceSettings.NegotiationTimeout;
  82. authenticator.PreserveBootstrapTokens = preserveBootstrapTokens;
  83. return authenticator;
  84. }
  85. else
  86. {
  87. sctResolver = new SecurityContextSecurityTokenResolver(localServiceSettings.MaxCachedCookies, true, localServiceSettings.MaxClockSkew);
  88. AcceleratedTokenAuthenticator authenticator = new AcceleratedTokenAuthenticator();
  89. authenticator.BootstrapSecurityBindingElement = SecurityUtils.GetIssuerSecurityBindingElement(recipientRequirement);
  90. authenticator.KeyEntropyMode = securityBindingElement.KeyEntropyMode;
  91. authenticator.EncryptStateInServiceToken = true;
  92. authenticator.IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>(ServiceModelSecurityTokenRequirement.IssuedSecurityTokenParametersProperty);
  93. authenticator.IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver;
  94. authenticator.IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecurityTokenRequirement.IssuerBindingContextProperty);
  95. authenticator.ListenUri = recipientRequirement.ListenUri;
  96. authenticator.SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite;
  97. authenticator.StandardsManager = SecurityUtils.CreateSecurityStandardsManager(recipientRequirement, this);
  98. authenticator.SecurityStateEncoder = parent.SecureConversationAuthentication.SecurityStateEncoder;
  99. authenticator.KnownTypes = parent.SecureConversationAuthentication.SecurityContextClaimTypes;
  100. authenticator.PreserveBootstrapTokens = preserveBootstrapTokens;
  101. // local security quotas
  102. authenticator.MaximumCachedNegotiationState = localServiceSettings.MaxStatefulNegotiations;
  103. authenticator.NegotiationTimeout = localServiceSettings.NegotiationTimeout;
  104. authenticator.ServiceTokenLifetime = localServiceSettings.IssuedCookieLifetime;
  105. authenticator.MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations;
  106. // audit settings
  107. authenticator.AuditLogLocation = recipientRequirement.AuditLogLocation;
  108. authenticator.SuppressAuditFailure = recipientRequirement.SuppressAuditFailure;
  109. authenticator.MessageAuthenticationAuditLevel = recipientRequirement.MessageAuthenticationAuditLevel;
  110. authenticator.EndpointFilterTable = endpointFilterTable;
  111. return authenticator;
  112. }
  113. }
  114. SecurityTokenAuthenticator CreateSpnegoSecurityTokenAuthenticator(RecipientServiceModelSecurityTokenRequirement recipientRequirement, out SecurityTokenResolver sctResolver)
  115. {
  116. SecurityBindingElement securityBindingElement = recipientRequirement.SecurityBindingElement;
  117. if (securityBindingElement == null)
  118. {
  119. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.TokenAuthenticatorRequiresSecurityBindingElement, recipientRequirement));
  120. }
  121. bool isCookieMode = !recipientRequirement.SupportSecurityContextCancellation;
  122. LocalServiceSecuritySettings localServiceSettings = securityBindingElement.LocalServiceSettings;
  123. sctResolver = new SecurityContextSecurityTokenResolver(localServiceSettings.MaxCachedCookies, true);
  124. ExtendedProtectionPolicy extendedProtectionPolicy = null;
  125. recipientRequirement.TryGetProperty<ExtendedProtectionPolicy>(ServiceModelSecurityTokenRequirement.ExtendedProtectionPolicy, out extendedProtectionPolicy);
  126. SpnegoTokenAuthenticator authenticator = new SpnegoTokenAuthenticator();
  127. authenticator.ExtendedProtectionPolicy = extendedProtectionPolicy;
  128. authenticator.AllowUnauthenticatedCallers = parent.WindowsAuthentication.AllowAnonymousLogons;
  129. authenticator.ExtractGroupsForWindowsAccounts = parent.WindowsAuthentication.IncludeWindowsGroups;
  130. authenticator.IsClientAnonymous = false;
  131. authenticator.EncryptStateInServiceToken = isCookieMode;
  132. authenticator.IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>(ServiceModelSecurityTokenRequirement.IssuedSecurityTokenParametersProperty);
  133. authenticator.IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver;
  134. authenticator.IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecurityTokenRequirement.IssuerBindingContextProperty);
  135. authenticator.ListenUri = recipientRequirement.ListenUri;
  136. authenticator.SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite;
  137. authenticator.StandardsManager = SecurityUtils.CreateSecurityStandardsManager(recipientRequirement, this);
  138. authenticator.SecurityStateEncoder = parent.SecureConversationAuthentication.SecurityStateEncoder;
  139. authenticator.KnownTypes = parent.SecureConversationAuthentication.SecurityContextClaimTypes;
  140. // if the SPNEGO is being done in mixed-mode, the nego blobs are from an anonymous client and so there size bound needs to be enforced.
  141. if (securityBindingElement is TransportSecurityBindingElement)
  142. {
  143. authenticator.MaxMessageSize = SecurityUtils.GetMaxNegotiationBufferSize(authenticator.IssuerBindingContext);
  144. }
  145. // local security quotas
  146. authenticator.MaximumCachedNegotiationState = localServiceSettings.MaxStatefulNegotiations;
  147. authenticator.NegotiationTimeout = localServiceSettings.NegotiationTimeout;
  148. authenticator.ServiceTokenLifetime = localServiceSettings.IssuedCookieLifetime;
  149. authenticator.MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations;
  150. // audit settings
  151. authenticator.AuditLogLocation = recipientRequirement.AuditLogLocation;
  152. authenticator.SuppressAuditFailure = recipientRequirement.SuppressAuditFailure;
  153. authenticator.MessageAuthenticationAuditLevel = recipientRequirement.MessageAuthenticationAuditLevel;
  154. return authenticator;
  155. }
  156. SecurityTokenAuthenticator CreateTlsnegoClientX509TokenAuthenticator(RecipientServiceModelSecurityTokenRequirement recipientRequirement)
  157. {
  158. RecipientServiceModelSecurityTokenRequirement clientX509Requirement = new RecipientServiceModelSecurityTokenRequirement();
  159. clientX509Requirement.TokenType = SecurityTokenTypes.X509Certificate;
  160. clientX509Requirement.KeyUsage = SecurityKeyUsage.Signature;
  161. clientX509Requirement.ListenUri = recipientRequirement.ListenUri;
  162. clientX509Requirement.KeyType = SecurityKeyType.AsymmetricKey;
  163. clientX509Requirement.SecurityBindingElement = recipientRequirement.SecurityBindingElement;
  164. SecurityTokenResolver dummy;
  165. return this.CreateSecurityTokenAuthenticator(clientX509Requirement, out dummy);
  166. }
  167. SecurityTokenProvider CreateTlsnegoServerX509TokenProvider(RecipientServiceModelSecurityTokenRequirement recipientRequirement)
  168. {
  169. RecipientServiceModelSecurityTokenRequirement serverX509Requirement = new RecipientServiceModelSecurityTokenRequirement();
  170. serverX509Requirement.TokenType = SecurityTokenTypes.X509Certificate;
  171. serverX509Requirement.KeyUsage = SecurityKeyUsage.Exchange;
  172. serverX509Requirement.ListenUri = recipientRequirement.ListenUri;
  173. serverX509Requirement.KeyType = SecurityKeyType.AsymmetricKey;
  174. serverX509Requirement.SecurityBindingElement = recipientRequirement.SecurityBindingElement;
  175. return this.CreateSecurityTokenProvider(serverX509Requirement);
  176. }
  177. SecurityTokenAuthenticator CreateTlsnegoSecurityTokenAuthenticator(RecipientServiceModelSecurityTokenRequirement recipientRequirement, bool requireClientCertificate, out SecurityTokenResolver sctResolver)
  178. {
  179. SecurityBindingElement securityBindingElement = recipientRequirement.SecurityBindingElement;
  180. if (securityBindingElement == null)
  181. {
  182. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.TokenAuthenticatorRequiresSecurityBindingElement, recipientRequirement));
  183. }
  184. bool isCookieMode = !recipientRequirement.SupportSecurityContextCancellation;
  185. LocalServiceSecuritySettings localServiceSettings = securityBindingElement.LocalServiceSettings;
  186. sctResolver = new SecurityContextSecurityTokenResolver(localServiceSettings.MaxCachedCookies, true);
  187. TlsnegoTokenAuthenticator authenticator = new TlsnegoTokenAuthenticator();
  188. authenticator.IsClientAnonymous = !requireClientCertificate;
  189. if (requireClientCertificate)
  190. {
  191. authenticator.ClientTokenAuthenticator = this.CreateTlsnegoClientX509TokenAuthenticator(recipientRequirement);
  192. authenticator.MapCertificateToWindowsAccount = this.ServiceCredentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount;
  193. }
  194. authenticator.EncryptStateInServiceToken = isCookieMode;
  195. authenticator.IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>(ServiceModelSecurityTokenRequirement.IssuedSecurityTokenParametersProperty);
  196. authenticator.IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver;
  197. authenticator.IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecurityTokenRequirement.IssuerBindingContextProperty);
  198. authenticator.ListenUri = recipientRequirement.ListenUri;
  199. authenticator.SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite;
  200. authenticator.StandardsManager = SecurityUtils.CreateSecurityStandardsManager(recipientRequirement, this);
  201. authenticator.SecurityStateEncoder = parent.SecureConversationAuthentication.SecurityStateEncoder;
  202. authenticator.KnownTypes = parent.SecureConversationAuthentication.SecurityContextClaimTypes;
  203. authenticator.ServerTokenProvider = CreateTlsnegoServerX509TokenProvider(recipientRequirement);
  204. // local security quotas
  205. authenticator.MaximumCachedNegotiationState = localServiceSettings.MaxStatefulNegotiations;
  206. authenticator.NegotiationTimeout = localServiceSettings.NegotiationTimeout;
  207. authenticator.ServiceTokenLifetime = localServiceSettings.IssuedCookieLifetime;
  208. authenticator.MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations;
  209. // if the TLSNEGO is being done in mixed-mode, the nego blobs are from an anonymous client and so there size bound needs to be enforced.
  210. if (securityBindingElement is TransportSecurityBindingElement)
  211. {
  212. authenticator.MaxMessageSize = SecurityUtils.GetMaxNegotiationBufferSize(authenticator.IssuerBindingContext);
  213. }
  214. // audit settings
  215. authenticator.AuditLogLocation = recipientRequirement.AuditLogLocation;
  216. authenticator.SuppressAuditFailure = recipientRequirement.SuppressAuditFailure;
  217. authenticator.MessageAuthenticationAuditLevel = recipientRequirement.MessageAuthenticationAuditLevel;
  218. return authenticator;
  219. }
  220. X509SecurityTokenAuthenticator CreateClientX509TokenAuthenticator()
  221. {
  222. X509ClientCertificateAuthentication authentication = parent.ClientCertificate.Authentication;
  223. return new X509SecurityTokenAuthenticator(authentication.GetCertificateValidator(), authentication.MapClientCertificateToWindowsAccount, authentication.IncludeWindowsGroups);
  224. }
  225. SamlSecurityTokenAuthenticator CreateSamlTokenAuthenticator(RecipientServiceModelSecurityTokenRequirement recipientRequirement, out SecurityTokenResolver outOfBandTokenResolver)
  226. {
  227. if (recipientRequirement == null)
  228. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("recipientRequirement");
  229. Collection<SecurityToken> outOfBandTokens = new Collection<SecurityToken>();
  230. if (parent.ServiceCertificate.Certificate != null)
  231. {
  232. outOfBandTokens.Add(new X509SecurityToken(parent.ServiceCertificate.Certificate));
  233. }
  234. List<SecurityTokenAuthenticator> supportingAuthenticators = new List<SecurityTokenAuthenticator>();
  235. if ((parent.IssuedTokenAuthentication.KnownCertificates != null) && (parent.IssuedTokenAuthentication.KnownCertificates.Count > 0))
  236. {
  237. for (int i = 0; i < parent.IssuedTokenAuthentication.KnownCertificates.Count; ++i)
  238. {
  239. outOfBandTokens.Add(new X509SecurityToken(parent.IssuedTokenAuthentication.KnownCertificates[i]));
  240. }
  241. }
  242. X509CertificateValidator validator = parent.IssuedTokenAuthentication.GetCertificateValidator();
  243. supportingAuthenticators.Add(new X509SecurityTokenAuthenticator(validator));
  244. if (parent.IssuedTokenAuthentication.AllowUntrustedRsaIssuers)
  245. {
  246. supportingAuthenticators.Add(new RsaSecurityTokenAuthenticator());
  247. }
  248. outOfBandTokenResolver = (outOfBandTokens.Count > 0) ? SecurityTokenResolver.CreateDefaultSecurityTokenResolver(new ReadOnlyCollection<SecurityToken>(outOfBandTokens), false) : null;
  249. SamlSecurityTokenAuthenticator ssta;
  250. if ((recipientRequirement.SecurityBindingElement == null) || (recipientRequirement.SecurityBindingElement.LocalServiceSettings == null))
  251. {
  252. ssta = new SamlSecurityTokenAuthenticator(supportingAuthenticators);
  253. }
  254. else
  255. {
  256. ssta = new SamlSecurityTokenAuthenticator(supportingAuthenticators, recipientRequirement.SecurityBindingElement.LocalServiceSettings.MaxClockSkew);
  257. }
  258. // set audience uri restrictions
  259. ssta.AudienceUriMode = parent.IssuedTokenAuthentication.AudienceUriMode;
  260. IList<string> allowedAudienceUris = ssta.AllowedAudienceUris;
  261. if (parent.IssuedTokenAuthentication.AllowedAudienceUris != null)
  262. {
  263. for (int i = 0; i < parent.IssuedTokenAuthentication.AllowedAudienceUris.Count; i++)
  264. allowedAudienceUris.Add(parent.IssuedTokenAuthentication.AllowedAudienceUris[i]);
  265. }
  266. if (recipientRequirement.ListenUri != null)
  267. {
  268. allowedAudienceUris.Add(recipientRequirement.ListenUri.AbsoluteUri);
  269. }
  270. return ssta;
  271. }
  272. X509SecurityTokenProvider CreateServerX509TokenProvider()
  273. {
  274. if (parent.ServiceCertificate.Certificate == null)
  275. {
  276. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ServiceCertificateNotProvidedOnServiceCredentials)));
  277. }
  278. SecurityUtils.EnsureCertificateCanDoKeyExchange(parent.ServiceCertificate.Certificate);
  279. return new ServiceX509SecurityTokenProvider(parent.ServiceCertificate.Certificate);
  280. }
  281. protected bool IsIssuedSecurityTokenRequirement(SecurityTokenRequirement requirement)
  282. {
  283. return (requirement != null && requirement.Properties.ContainsKey(ServiceModelSecurityTokenRequirement.IssuerAddressProperty));
  284. }
  285. public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
  286. {
  287. if (tokenRequirement == null)
  288. {
  289. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("tokenRequirement");
  290. }
  291. string tokenType = tokenRequirement.TokenType;
  292. outOfBandTokenResolver = null;
  293. SecurityTokenAuthenticator result = null;
  294. if (tokenRequirement is InitiatorServiceModelSecurityTokenRequirement)
  295. {
  296. // this is the uncorrelated duplex case in which the server is asking for
  297. // an authenticator to validate its provisioned client certificate
  298. if (tokenType == SecurityTokenTypes.X509Certificate && tokenRequirement.KeyUsage == SecurityKeyUsage.Exchange)
  299. {
  300. return new X509SecurityTokenAuthenticator(X509CertificateValidator.None, false);
  301. }
  302. }
  303. RecipientServiceModelSecurityTokenRequirement recipientRequirement = tokenRequirement as RecipientServiceModelSecurityTokenRequirement;
  304. if (recipientRequirement == null)
  305. {
  306. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.GetString(SR.SecurityTokenManagerCannotCreateAuthenticatorForRequirement, tokenRequirement)));
  307. }
  308. if (tokenType == SecurityTokenTypes.X509Certificate)
  309. {
  310. result = CreateClientX509TokenAuthenticator();
  311. }
  312. else if (tokenType == SecurityTokenTypes.Kerberos)
  313. {
  314. result = new KerberosSecurityTokenAuthenticatorWrapper(
  315. new KerberosSecurityTokenAuthenticator(parent.WindowsAuthentication.IncludeWindowsGroups));
  316. }
  317. else if (tokenType == SecurityTokenTypes.UserName)
  318. {
  319. if (parent.UserNameAuthentication.UserNamePasswordValidationMode == UserNamePasswordValidationMode.Windows)
  320. {
  321. if (parent.UserNameAuthentication.CacheLogonTokens)
  322. {
  323. result = new WindowsUserNameCachingSecurityTokenAuthenticator(parent.UserNameAuthentication.IncludeWindowsGroups,
  324. parent.UserNameAuthentication.MaxCachedLogonTokens, parent.UserNameAuthentication.CachedLogonTokenLifetime);
  325. }
  326. else
  327. {
  328. result = new WindowsUserNameSecurityTokenAuthenticator(parent.UserNameAuthentication.IncludeWindowsGroups);
  329. }
  330. }
  331. else
  332. {
  333. result = new CustomUserNameSecurityTokenAuthenticator(parent.UserNameAuthentication.GetUserNamePasswordValidator());
  334. }
  335. }
  336. else if (tokenType == SecurityTokenTypes.Rsa)
  337. {
  338. result = new RsaSecurityTokenAuthenticator();
  339. }
  340. else if (tokenType == ServiceModelSecurityTokenTypes.AnonymousSslnego)
  341. {
  342. result = CreateTlsnegoSecurityTokenAuthenticator(recipientRequirement, false, out outOfBandTokenResolver);
  343. }
  344. else if (tokenType == ServiceModelSecurityTokenTypes.MutualSslnego)
  345. {
  346. result = CreateTlsnegoSecurityTokenAuthenticator(recipientRequirement, true, out outOfBandTokenResolver);
  347. }
  348. else if (tokenType == ServiceModelSecurityTokenTypes.Spnego)
  349. {
  350. result = CreateSpnegoSecurityTokenAuthenticator(recipientRequirement, out outOfBandTokenResolver);
  351. }
  352. else if (tokenType == ServiceModelSecurityTokenTypes.SecureConversation)
  353. {
  354. result = CreateSecureConversationTokenAuthenticator(recipientRequirement, false, out outOfBandTokenResolver);
  355. }
  356. else if ((tokenType == SecurityTokenTypes.Saml)
  357. || (tokenType == SecurityXXX2005Strings.SamlTokenType)
  358. || (tokenType == SecurityJan2004Strings.SamlUri)
  359. || (tokenType == null && IsIssuedSecurityTokenRequirement(recipientRequirement)))
  360. {
  361. result = CreateSamlTokenAuthenticator(recipientRequirement, out outOfBandTokenResolver);
  362. }
  363. if (result == null)
  364. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.GetString(SR.SecurityTokenManagerCannotCreateAuthenticatorForRequirement, tokenRequirement)));
  365. return result;
  366. }
  367. SecurityTokenProvider CreateLocalSecurityTokenProvider(RecipientServiceModelSecurityTokenRequirement recipientRequirement)
  368. {
  369. string tokenType = recipientRequirement.TokenType;
  370. SecurityTokenProvider result = null;
  371. if (tokenType == SecurityTokenTypes.X509Certificate)
  372. {
  373. result = CreateServerX509TokenProvider();
  374. }
  375. else if (tokenType == ServiceModelSecurityTokenTypes.SspiCredential)
  376. {
  377. // if Transport Security, AuthenicationSchemes.Basic will look at parent.UserNameAuthentication settings.
  378. AuthenticationSchemes authenticationScheme;
  379. bool authenticationSchemeIdentified = recipientRequirement.TryGetProperty<AuthenticationSchemes>(ServiceModelSecurityTokenRequirement.HttpAuthenticationSchemeProperty, out authenticationScheme);
  380. if (authenticationSchemeIdentified &&
  381. authenticationScheme.IsSet(AuthenticationSchemes.Basic) &&
  382. authenticationScheme.IsNotSet(AuthenticationSchemes.Digest | AuthenticationSchemes.Ntlm | AuthenticationSchemes.Negotiate))
  383. {
  384. // create security token provider even when basic and Anonymous are enabled.
  385. result = new SspiSecurityTokenProvider(null, parent.UserNameAuthentication.IncludeWindowsGroups, false);
  386. }
  387. else
  388. {
  389. if (authenticationSchemeIdentified &&
  390. authenticationScheme.IsSet(AuthenticationSchemes.Basic) &&
  391. parent.WindowsAuthentication.IncludeWindowsGroups != parent.UserNameAuthentication.IncludeWindowsGroups)
  392. {
  393. // Ensure there are no inconsistencies when Basic and (Digest and/or Ntlm and/or Negotiate) are both enabled
  394. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.GetString(SR.SecurityTokenProviderIncludeWindowsGroupsInconsistent,
  395. (AuthenticationSchemes)authenticationScheme - AuthenticationSchemes.Basic,
  396. parent.UserNameAuthentication.IncludeWindowsGroups,
  397. parent.WindowsAuthentication.IncludeWindowsGroups)));
  398. }
  399. result = new SspiSecurityTokenProvider(null, parent.WindowsAuthentication.IncludeWindowsGroups, parent.WindowsAuthentication.AllowAnonymousLogons);
  400. }
  401. }
  402. return result;
  403. }
  404. SecurityTokenProvider CreateUncorrelatedDuplexSecurityTokenProvider(InitiatorServiceModelSecurityTokenRequirement initiatorRequirement)
  405. {
  406. string tokenType = initiatorRequirement.TokenType;
  407. SecurityTokenProvider result = null;
  408. if (tokenType == SecurityTokenTypes.X509Certificate)
  409. {
  410. SecurityKeyUsage keyUsage = initiatorRequirement.KeyUsage;
  411. if (keyUsage == SecurityKeyUsage.Exchange)
  412. {
  413. if (parent.ClientCertificate.Certificate == null)
  414. {
  415. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.ClientCertificateNotProvidedOnServiceCredentials)));
  416. }
  417. result = new X509SecurityTokenProvider(parent.ClientCertificate.Certificate);
  418. }
  419. else
  420. {
  421. // this is a request for the server's own cert for signing
  422. result = CreateServerX509TokenProvider();
  423. }
  424. }
  425. return result;
  426. }
  427. public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement requirement)
  428. {
  429. if (requirement == null)
  430. {
  431. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("requirement");
  432. }
  433. RecipientServiceModelSecurityTokenRequirement recipientRequirement = requirement as RecipientServiceModelSecurityTokenRequirement;
  434. SecurityTokenProvider result = null;
  435. if (recipientRequirement != null)
  436. {
  437. result = CreateLocalSecurityTokenProvider(recipientRequirement);
  438. }
  439. else if (requirement is InitiatorServiceModelSecurityTokenRequirement)
  440. {
  441. result = CreateUncorrelatedDuplexSecurityTokenProvider((InitiatorServiceModelSecurityTokenRequirement)requirement);
  442. }
  443. if (result == null)
  444. {
  445. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.GetString(SR.SecurityTokenManagerCannotCreateProviderForRequirement, requirement)));
  446. }
  447. return result;
  448. }
  449. public virtual EndpointIdentity GetIdentityOfSelf(SecurityTokenRequirement tokenRequirement)
  450. {
  451. if (tokenRequirement == null)
  452. {
  453. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("tokenRequirement");
  454. }
  455. if (tokenRequirement is RecipientServiceModelSecurityTokenRequirement)
  456. {
  457. string tokenType = tokenRequirement.TokenType;
  458. if (tokenType == SecurityTokenTypes.X509Certificate
  459. || tokenType == ServiceModelSecurityTokenTypes.AnonymousSslnego
  460. || tokenType == ServiceModelSecurityTokenTypes.MutualSslnego)
  461. {
  462. if (parent.ServiceCertificate.Certificate != null)
  463. {
  464. return EndpointIdentity.CreateX509CertificateIdentity(parent.ServiceCertificate.Certificate);
  465. }
  466. }
  467. else if (tokenType == SecurityTokenTypes.Kerberos || tokenType == ServiceModelSecurityTokenTypes.Spnego)
  468. {
  469. return SecurityUtils.CreateWindowsIdentity();
  470. }
  471. else if (tokenType == ServiceModelSecurityTokenTypes.SecureConversation)
  472. {
  473. SecurityBindingElement securityBindingElement = ((RecipientServiceModelSecurityTokenRequirement)tokenRequirement).SecureConversationSecurityBindingElement;
  474. if (securityBindingElement != null)
  475. {
  476. if (securityBindingElement == null || securityBindingElement is TransportSecurityBindingElement)
  477. {
  478. return null;
  479. }
  480. SecurityTokenParameters bootstrapProtectionParameters = (securityBindingElement is SymmetricSecurityBindingElement) ? ((SymmetricSecurityBindingElement)securityBindingElement).ProtectionTokenParameters : ((AsymmetricSecurityBindingElement)securityBindingElement).RecipientTokenParameters;
  481. SecurityTokenRequirement bootstrapRequirement = new RecipientServiceModelSecurityTokenRequirement();
  482. bootstrapProtectionParameters.InitializeSecurityTokenRequirement(bootstrapRequirement);
  483. return GetIdentityOfSelf(bootstrapRequirement);
  484. }
  485. }
  486. }
  487. return null;
  488. }
  489. internal class KerberosSecurityTokenAuthenticatorWrapper : CommunicationObjectSecurityTokenAuthenticator
  490. {
  491. KerberosSecurityTokenAuthenticator innerAuthenticator;
  492. System.IdentityModel.SafeFreeCredentials credentialsHandle = null;
  493. public KerberosSecurityTokenAuthenticatorWrapper(KerberosSecurityTokenAuthenticator innerAuthenticator)
  494. {
  495. this.innerAuthenticator = innerAuthenticator;
  496. }
  497. public override void OnOpening()
  498. {
  499. base.OnOpening();
  500. if (this.credentialsHandle == null)
  501. {
  502. this.credentialsHandle = SecurityUtils.GetCredentialsHandle("Kerberos", null, true);
  503. }
  504. }
  505. public override void OnClose(TimeSpan timeout)
  506. {
  507. base.OnClose(timeout);
  508. FreeCredentialsHandle();
  509. }
  510. public override void OnAbort()
  511. {
  512. base.OnAbort();
  513. FreeCredentialsHandle();
  514. }
  515. void FreeCredentialsHandle()
  516. {
  517. if (this.credentialsHandle != null)
  518. {
  519. this.credentialsHandle.Close();
  520. this.credentialsHandle = null;
  521. }
  522. }
  523. protected override bool CanValidateTokenCore(SecurityToken token)
  524. {
  525. return this.innerAuthenticator.CanValidateToken(token);
  526. }
  527. internal ReadOnlyCollection<IAuthorizationPolicy> ValidateToken(SecurityToken token, ChannelBinding channelBinding, ExtendedProtectionPolicy protectionPolicy)
  528. {
  529. KerberosReceiverSecurityToken kerberosToken = (KerberosReceiverSecurityToken)token;
  530. kerberosToken.Initialize(this.credentialsHandle, channelBinding, protectionPolicy);
  531. return this.innerAuthenticator.ValidateToken(kerberosToken);
  532. }
  533. protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateTokenCore(SecurityToken token)
  534. {
  535. return ValidateToken(token, null, null);
  536. }
  537. }
  538. }
  539. }