SecuritySessionSecurityTokenAuthenticator.cs 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352
  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.Globalization;
  9. using System.IdentityModel.Claims;
  10. using System.IdentityModel.Policy;
  11. using System.IdentityModel.Selectors;
  12. using System.IdentityModel.Tokens;
  13. using System.Runtime;
  14. using System.Runtime.Serialization;
  15. using System.ServiceModel;
  16. using System.ServiceModel.Channels;
  17. using System.ServiceModel.Description;
  18. using System.ServiceModel.Diagnostics;
  19. using System.ServiceModel.Dispatcher;
  20. using System.ServiceModel.Security.Tokens;
  21. using System.Xml;
  22. class SecuritySessionSecurityTokenAuthenticator : CommunicationObjectSecurityTokenAuthenticator, IIssuanceSecurityTokenAuthenticator, ILogonTokenCacheManager
  23. {
  24. internal static readonly TimeSpan defaultSessionTokenLifetime = TimeSpan.MaxValue;
  25. internal const int defaultMaxCachedSessionTokens = Int32.MaxValue;
  26. internal static readonly SecurityStandardsManager defaultStandardsManager = SecurityStandardsManager.DefaultInstance;
  27. bool isClientAnonymous;
  28. TimeSpan sessionTokenLifetime;
  29. ISecurityContextSecurityTokenCache issuedTokenCache;
  30. SecurityContextSecurityTokenAuthenticator sessionTokenAuthenticator;
  31. ServiceHostBase rstListener;
  32. SecurityBindingElement bootstrapSecurityBindingElement;
  33. BindingContext issuerBindingContext;
  34. SecurityStandardsManager standardsManager;
  35. SecurityAlgorithmSuite securityAlgorithmSuite;
  36. SecurityKeyEntropyMode keyEntropyMode;
  37. TimeSpan keyRenewalInterval;
  38. SecurityTokenParameters issuedTokenParameters;
  39. Uri listenUri;
  40. string sctUri;
  41. IMessageFilterTable<EndpointAddress> endpointFilterTable;
  42. bool shouldMatchRstWithEndpointFilter;
  43. int maximumConcurrentNegotiations;
  44. TimeSpan negotiationTimeout;
  45. Object thisLock = new Object();
  46. bool preserveBootstrapTokens;
  47. IssuedSecurityTokenHandler issuedSecurityTokenHandler;
  48. RenewedSecurityTokenHandler renewedSecurityTokenHandler;
  49. public SecuritySessionSecurityTokenAuthenticator()
  50. : base()
  51. {
  52. this.sessionTokenAuthenticator = new SecurityContextSecurityTokenAuthenticator();
  53. this.sessionTokenLifetime = defaultSessionTokenLifetime;
  54. this.isClientAnonymous = false;
  55. this.standardsManager = defaultStandardsManager;
  56. this.keyEntropyMode = AcceleratedTokenProvider.defaultKeyEntropyMode;
  57. this.maximumConcurrentNegotiations = AcceleratedTokenAuthenticator.defaultServerMaxActiveNegotiations;
  58. this.negotiationTimeout = AcceleratedTokenAuthenticator.defaultServerMaxNegotiationLifetime;
  59. }
  60. public IssuedSecurityTokenHandler IssuedSecurityTokenHandler
  61. {
  62. get
  63. {
  64. return this.issuedSecurityTokenHandler;
  65. }
  66. set
  67. {
  68. this.issuedSecurityTokenHandler = value;
  69. }
  70. }
  71. public RenewedSecurityTokenHandler RenewedSecurityTokenHandler
  72. {
  73. get
  74. {
  75. return this.renewedSecurityTokenHandler;
  76. }
  77. set
  78. {
  79. this.renewedSecurityTokenHandler = value;
  80. }
  81. }
  82. public SecurityAlgorithmSuite SecurityAlgorithmSuite
  83. {
  84. get
  85. {
  86. return this.securityAlgorithmSuite;
  87. }
  88. set
  89. {
  90. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  91. this.securityAlgorithmSuite = value;
  92. }
  93. }
  94. public SecurityKeyEntropyMode KeyEntropyMode
  95. {
  96. get
  97. {
  98. return this.keyEntropyMode;
  99. }
  100. set
  101. {
  102. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  103. SecurityKeyEntropyModeHelper.Validate(value);
  104. this.keyEntropyMode = value;
  105. }
  106. }
  107. public bool IsClientAnonymous
  108. {
  109. get
  110. {
  111. return this.isClientAnonymous;
  112. }
  113. set
  114. {
  115. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  116. this.isClientAnonymous = value;
  117. }
  118. }
  119. public TimeSpan SessionTokenLifetime
  120. {
  121. get
  122. {
  123. return this.sessionTokenLifetime;
  124. }
  125. set
  126. {
  127. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  128. if (value <= TimeSpan.Zero)
  129. {
  130. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", SR.GetString(SR.TimeSpanMustbeGreaterThanTimeSpanZero)));
  131. }
  132. if (TimeoutHelper.IsTooLarge(value))
  133. {
  134. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", value,
  135. SR.GetString(SR.SFxTimeoutOutOfRangeTooBig)));
  136. }
  137. this.sessionTokenLifetime = value;
  138. }
  139. }
  140. public TimeSpan KeyRenewalInterval
  141. {
  142. get
  143. {
  144. return this.keyRenewalInterval;
  145. }
  146. set
  147. {
  148. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  149. if (value <= TimeSpan.Zero)
  150. {
  151. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", SR.GetString(SR.TimeSpanMustbeGreaterThanTimeSpanZero)));
  152. }
  153. if (TimeoutHelper.IsTooLarge(value))
  154. {
  155. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", value,
  156. SR.GetString(SR.SFxTimeoutOutOfRangeTooBig)));
  157. }
  158. this.keyRenewalInterval = value;
  159. }
  160. }
  161. public int MaximumConcurrentNegotiations
  162. {
  163. get
  164. {
  165. return this.maximumConcurrentNegotiations;
  166. }
  167. set
  168. {
  169. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  170. if (value < 0)
  171. {
  172. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value", SR.GetString(SR.ValueMustBeNonNegative)));
  173. }
  174. this.maximumConcurrentNegotiations = value;
  175. }
  176. }
  177. public TimeSpan NegotiationTimeout
  178. {
  179. get
  180. {
  181. return this.negotiationTimeout;
  182. }
  183. set
  184. {
  185. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  186. if (value <= TimeSpan.Zero)
  187. {
  188. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value"));
  189. }
  190. this.negotiationTimeout = value;
  191. }
  192. }
  193. public SecurityContextSecurityTokenAuthenticator SessionTokenAuthenticator
  194. {
  195. get
  196. {
  197. return this.sessionTokenAuthenticator;
  198. }
  199. }
  200. public ISecurityContextSecurityTokenCache IssuedTokenCache
  201. {
  202. get
  203. {
  204. return this.issuedTokenCache;
  205. }
  206. set
  207. {
  208. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  209. this.issuedTokenCache = value;
  210. }
  211. }
  212. public SecurityStandardsManager StandardsManager
  213. {
  214. get
  215. {
  216. return this.standardsManager;
  217. }
  218. set
  219. {
  220. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  221. if (value == null)
  222. {
  223. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("value"));
  224. }
  225. if (!value.TrustDriver.IsSessionSupported)
  226. {
  227. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.TrustDriverVersionDoesNotSupportSession), "value"));
  228. }
  229. if (!value.SecureConversationDriver.IsSessionSupported)
  230. {
  231. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SecureConversationDriverVersionDoesNotSupportSession), "value"));
  232. }
  233. this.standardsManager = value;
  234. }
  235. }
  236. public SecurityTokenParameters IssuedSecurityTokenParameters
  237. {
  238. get
  239. {
  240. return this.issuedTokenParameters;
  241. }
  242. set
  243. {
  244. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  245. this.issuedTokenParameters = value;
  246. }
  247. }
  248. public BindingContext IssuerBindingContext
  249. {
  250. get
  251. {
  252. return this.issuerBindingContext;
  253. }
  254. set
  255. {
  256. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  257. if (value == null)
  258. {
  259. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
  260. }
  261. this.issuerBindingContext = value.Clone();
  262. }
  263. }
  264. public SecurityBindingElement BootstrapSecurityBindingElement
  265. {
  266. get { return this.bootstrapSecurityBindingElement; }
  267. set
  268. {
  269. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  270. if (value == null)
  271. {
  272. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
  273. }
  274. this.bootstrapSecurityBindingElement = (SecurityBindingElement)value.Clone();
  275. }
  276. }
  277. public IMessageFilterTable<EndpointAddress> EndpointFilterTable
  278. {
  279. get
  280. {
  281. return this.endpointFilterTable;
  282. }
  283. set
  284. {
  285. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  286. this.endpointFilterTable = value;
  287. }
  288. }
  289. public Uri ListenUri
  290. {
  291. get { return this.listenUri; }
  292. set
  293. {
  294. this.CommunicationObject.ThrowIfDisposedOrImmutable();
  295. this.listenUri = value;
  296. }
  297. }
  298. public virtual XmlDictionaryString IssueAction
  299. {
  300. get
  301. {
  302. return standardsManager.SecureConversationDriver.IssueAction;
  303. }
  304. }
  305. public virtual XmlDictionaryString IssueResponseAction
  306. {
  307. get
  308. {
  309. return standardsManager.SecureConversationDriver.IssueResponseAction;
  310. }
  311. }
  312. public bool PreserveBootstrapTokens
  313. {
  314. get
  315. {
  316. return this.preserveBootstrapTokens;
  317. }
  318. set
  319. {
  320. this.preserveBootstrapTokens = value;
  321. }
  322. }
  323. public virtual XmlDictionaryString RenewAction
  324. {
  325. get
  326. {
  327. return standardsManager.SecureConversationDriver.RenewAction;
  328. }
  329. }
  330. public virtual XmlDictionaryString RenewResponseAction
  331. {
  332. get
  333. {
  334. return standardsManager.SecureConversationDriver.RenewResponseAction;
  335. }
  336. }
  337. public virtual XmlDictionaryString CloseAction
  338. {
  339. get
  340. {
  341. return standardsManager.SecureConversationDriver.CloseAction;
  342. }
  343. }
  344. public virtual XmlDictionaryString CloseResponseAction
  345. {
  346. get
  347. {
  348. return standardsManager.SecureConversationDriver.CloseResponseAction;
  349. }
  350. }
  351. public bool RemoveCachedLogonToken(string username)
  352. {
  353. if (this.RequestSecurityTokenListener != null)
  354. {
  355. //
  356. // this is the SCT case, delegate to the RST's listener list
  357. //
  358. IChannelListener listener = null;
  359. ILogonTokenCacheManager manager = null;
  360. for (int i = 0; i < this.RequestSecurityTokenListener.ChannelDispatchers.Count; i++)
  361. {
  362. listener = this.RequestSecurityTokenListener.ChannelDispatchers[i].Listener;
  363. if (listener != null)
  364. {
  365. manager = listener.GetProperty<ILogonTokenCacheManager>();
  366. if (manager != null)
  367. return manager.RemoveCachedLogonToken(username);
  368. }
  369. }
  370. }
  371. return false;
  372. }
  373. public void FlushLogonTokenCache()
  374. {
  375. if (this.RequestSecurityTokenListener != null && this.RequestSecurityTokenListener.ChannelDispatchers.Count > 0)
  376. {
  377. //
  378. // this is the SCT case, delegate to the RST's listener list
  379. //
  380. IChannelListener listener = null;
  381. ILogonTokenCacheManager manager = null;
  382. for (int i = 0; i < this.RequestSecurityTokenListener.ChannelDispatchers.Count; i++)
  383. {
  384. listener = this.RequestSecurityTokenListener.ChannelDispatchers[i].Listener;
  385. if (listener != null)
  386. {
  387. manager = listener.GetProperty<ILogonTokenCacheManager>();
  388. if (manager != null)
  389. manager.FlushLogonTokenCache();
  390. }
  391. }
  392. }
  393. }
  394. Message HandleOperationException(SecuritySessionOperation operation, Message request, Exception e)
  395. {
  396. SecurityTraceRecordHelper.TraceServerSessionOperationException(operation, e, this.ListenUri);
  397. return CreateFault(request, e);
  398. }
  399. Message CreateFault(Message request, Exception e)
  400. {
  401. FaultCode subCode;
  402. FaultReason reason;
  403. bool isSenderFault;
  404. if (e is QuotaExceededException)
  405. {
  406. // send a receiver fault so that the sender can retry
  407. subCode = new FaultCode(DotNetSecurityStrings.SecurityServerTooBusyFault, DotNetSecurityStrings.Namespace);
  408. reason = new FaultReason(SR.GetString(SR.PendingSessionsExceededFaultReason), CultureInfo.CurrentCulture);
  409. isSenderFault = false;
  410. }
  411. else if (e is EndpointNotFoundException)
  412. {
  413. // send a receiver fault so that the sender can retry
  414. subCode = new FaultCode(AddressingStrings.EndpointUnavailable, request.Version.Addressing.Namespace);
  415. reason = new FaultReason(SR.GetString(SR.SecurityListenerClosingFaultReason), CultureInfo.CurrentCulture);
  416. isSenderFault = false;
  417. }
  418. else
  419. {
  420. subCode = new FaultCode(TrustApr2004Strings.InvalidRequestFaultCode, TrustFeb2005Strings.Namespace);
  421. reason = new FaultReason(SR.GetString(SR.InvalidRequestTrustFaultCode), CultureInfo.CurrentCulture);
  422. isSenderFault = true;
  423. }
  424. FaultCode faultCode;
  425. if (isSenderFault)
  426. {
  427. faultCode = FaultCode.CreateSenderFaultCode(subCode);
  428. }
  429. else
  430. {
  431. faultCode = FaultCode.CreateReceiverFaultCode(subCode);
  432. }
  433. MessageFault fault = MessageFault.CreateFault(faultCode, reason);
  434. Message faultReply = Message.CreateMessage(request.Version, fault, request.Version.Addressing.DefaultFaultAction);
  435. faultReply.Headers.RelatesTo = request.Headers.MessageId;
  436. return faultReply;
  437. }
  438. void NotifyOperationCompletion(SecuritySessionOperation operation, SecurityContextSecurityToken newSessionToken, SecurityContextSecurityToken previousSessionToken, EndpointAddress remoteAddress)
  439. {
  440. if (operation == SecuritySessionOperation.Issue)
  441. {
  442. if (this.issuedSecurityTokenHandler != null)
  443. {
  444. this.issuedSecurityTokenHandler(newSessionToken, remoteAddress);
  445. }
  446. else
  447. {
  448. throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.IssueSessionTokenHandlerNotSet));
  449. }
  450. }
  451. else if (operation == SecuritySessionOperation.Renew)
  452. {
  453. if (this.renewedSecurityTokenHandler != null)
  454. {
  455. this.renewedSecurityTokenHandler(newSessionToken, previousSessionToken);
  456. }
  457. else
  458. {
  459. throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.RenewSessionTokenHandlerNotSet));
  460. }
  461. }
  462. else
  463. {
  464. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
  465. }
  466. }
  467. public override void OnAbort()
  468. {
  469. if (this.rstListener != null)
  470. {
  471. this.rstListener.Abort();
  472. this.rstListener = null;
  473. }
  474. base.OnAbort();
  475. }
  476. public override void OnClose(TimeSpan timeout)
  477. {
  478. TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
  479. if (this.rstListener != null)
  480. {
  481. this.rstListener.Close(timeoutHelper.RemainingTime());
  482. this.rstListener = null;
  483. }
  484. base.OnClose(timeoutHelper.RemainingTime());
  485. }
  486. public override void OnOpen(TimeSpan timeout)
  487. {
  488. if (this.BootstrapSecurityBindingElement == null)
  489. {
  490. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.BootstrapSecurityBindingElementNotSet, this.GetType())));
  491. }
  492. if (this.IssuerBindingContext == null)
  493. {
  494. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.IssuerBuildContextNotSet, this.GetType())));
  495. }
  496. if (this.IssuedSecurityTokenParameters == null)
  497. {
  498. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.IssuedSecurityTokenParametersNotSet, this.GetType())));
  499. }
  500. if (this.SecurityAlgorithmSuite == null)
  501. {
  502. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SecurityAlgorithmSuiteNotSet, this.GetType())));
  503. }
  504. if (this.IssuedTokenCache == null)
  505. {
  506. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.IssuedTokenCacheNotSet, this.GetType())));
  507. }
  508. TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
  509. SetupSessionListener();
  510. this.rstListener.Open(timeoutHelper.RemainingTime());
  511. this.sctUri = this.StandardsManager.SecureConversationDriver.TokenTypeUri;
  512. base.OnOpen(timeoutHelper.RemainingTime());
  513. }
  514. protected override bool CanValidateTokenCore(SecurityToken token)
  515. {
  516. return (token is SecurityContextSecurityToken);
  517. }
  518. protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateTokenCore(SecurityToken token)
  519. {
  520. SecurityContextSecurityToken sct = (SecurityContextSecurityToken)token;
  521. return sct.AuthorizationPolicies;
  522. }
  523. static bool IsSameIdentity(ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies, ServiceSecurityContext incomingContext)
  524. {
  525. Claim identityClaim = SecurityUtils.GetPrimaryIdentityClaim(authorizationPolicies);
  526. if (identityClaim == null)
  527. {
  528. return incomingContext.IsAnonymous;
  529. }
  530. else
  531. {
  532. return Claim.DefaultComparer.Equals(incomingContext.IdentityClaim, identityClaim);
  533. }
  534. }
  535. DateTime GetKeyExpirationTime(SecurityToken currentToken, DateTime keyEffectiveTime)
  536. {
  537. DateTime keyExpirationTime = TimeoutHelper.Add(keyEffectiveTime, this.keyRenewalInterval);
  538. DateTime tokenExpirationTime = (currentToken != null) ? currentToken.ValidTo : TimeoutHelper.Add(keyEffectiveTime, this.sessionTokenLifetime);
  539. if (keyExpirationTime > tokenExpirationTime)
  540. {
  541. keyExpirationTime = tokenExpirationTime;
  542. }
  543. return keyExpirationTime;
  544. }
  545. internal static ReadOnlyCollection<IAuthorizationPolicy> CreateSecureConversationPolicies(SecurityMessageProperty security, DateTime expirationTime)
  546. {
  547. return CreateSecureConversationPolicies(security, null, expirationTime);
  548. }
  549. static ReadOnlyCollection<IAuthorizationPolicy> CreateSecureConversationPolicies(SecurityMessageProperty security, ReadOnlyCollection<IAuthorizationPolicy> currentTokenPolicies, DateTime expirationTime)
  550. {
  551. if (security == null)
  552. {
  553. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("security");
  554. }
  555. List<IAuthorizationPolicy> authorizationPolicies = new List<IAuthorizationPolicy>();
  556. if ((security.ServiceSecurityContext != null) &&
  557. (security.ServiceSecurityContext.AuthorizationPolicies != null))
  558. {
  559. authorizationPolicies.AddRange(security.ServiceSecurityContext.AuthorizationPolicies);
  560. // Remove any Transport token policies. We do not include
  561. // these in the SCT as these policies will be available with
  562. // the application messages as well.
  563. if ((security.TransportToken != null) &&
  564. (security.TransportToken.SecurityTokenPolicies != null) &&
  565. (security.TransportToken.SecurityTokenPolicies.Count > 0))
  566. {
  567. foreach (IAuthorizationPolicy policy in security.TransportToken.SecurityTokenPolicies)
  568. {
  569. if (authorizationPolicies.Contains(policy))
  570. {
  571. authorizationPolicies.Remove(policy);
  572. }
  573. }
  574. }
  575. if (currentTokenPolicies != null)
  576. {
  577. for (int i = 0; i < currentTokenPolicies.Count; ++i)
  578. {
  579. if (authorizationPolicies.Contains(currentTokenPolicies[i]))
  580. {
  581. authorizationPolicies.Remove(currentTokenPolicies[i]);
  582. }
  583. }
  584. }
  585. UnconditionalPolicy sctPolicy;
  586. for (int i = 0; i < authorizationPolicies.Count; i++)
  587. {
  588. if (authorizationPolicies[i].GetType() == typeof(UnconditionalPolicy))
  589. {
  590. UnconditionalPolicy bootstrapPolicy = (UnconditionalPolicy)authorizationPolicies[i];
  591. sctPolicy = new UnconditionalPolicy(bootstrapPolicy.PrimaryIdentity, bootstrapPolicy.Issuances, expirationTime);
  592. authorizationPolicies[i] = sctPolicy;
  593. }
  594. }
  595. }
  596. return authorizationPolicies.AsReadOnly();
  597. }
  598. SecurityContextSecurityToken IssueToken(RequestSecurityToken rst, Message request, SecurityContextSecurityToken currentToken, ReadOnlyCollection<IAuthorizationPolicy> currentTokenPolicies, out RequestSecurityTokenResponse rstr)
  599. {
  600. if (rst.TokenType != null && rst.TokenType != this.sctUri)
  601. {
  602. throw TraceUtility.ThrowHelperWarning(new InvalidOperationException(SR.GetString(SR.CannotIssueRstTokenType, rst.TokenType)), request);
  603. }
  604. // ensure that a SecurityContext is present in the message
  605. ServiceSecurityContext clientContext;
  606. SecurityMessageProperty securityProperty = request.Properties.Security;
  607. if (securityProperty != null)
  608. {
  609. clientContext = securityProperty.ServiceSecurityContext;
  610. }
  611. else
  612. {
  613. clientContext = ServiceSecurityContext.Anonymous;
  614. }
  615. if (clientContext == null)
  616. {
  617. throw TraceUtility.ThrowHelperWarning(new InvalidOperationException(SR.GetString(SR.SecurityContextMissing, request.Headers.Action)), request);
  618. }
  619. if (currentToken != null)
  620. {
  621. // ensure that the same party is renewing the token
  622. if (!IsSameIdentity(currentToken.AuthorizationPolicies, clientContext))
  623. {
  624. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.WrongIdentityRenewingToken)), request);
  625. }
  626. }
  627. // check if the client specified entropy
  628. byte[] proofKey;
  629. byte[] issuerEntropy;
  630. int issuedKeySize;
  631. SecurityToken proofToken;
  632. WSTrust.Driver.ProcessRstAndIssueKey(rst, null, this.KeyEntropyMode, this.SecurityAlgorithmSuite, out issuedKeySize,
  633. out issuerEntropy, out proofKey, out proofToken);
  634. SecurityContextSecurityToken newToken;
  635. DateTime keyEffectiveTime = DateTime.UtcNow;
  636. DateTime keyExpirationTime = GetKeyExpirationTime(currentToken, keyEffectiveTime);
  637. ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies = (securityProperty != null) ?
  638. CreateSecureConversationPolicies(securityProperty, currentTokenPolicies, keyExpirationTime) : EmptyReadOnlyCollection<IAuthorizationPolicy>.Instance;
  639. if (currentToken != null)
  640. {
  641. newToken = new SecurityContextSecurityToken(currentToken, SecurityUtils.GenerateId(), proofKey,
  642. SecurityUtils.GenerateUniqueId(), keyEffectiveTime, keyExpirationTime, authorizationPolicies);
  643. }
  644. else
  645. {
  646. UniqueId contextId = SecurityUtils.GenerateUniqueId();
  647. string id = SecurityUtils.GenerateId();
  648. DateTime tokenEffectiveTime = keyEffectiveTime;
  649. DateTime tokenExpirationTime = TimeoutHelper.Add(tokenEffectiveTime, this.sessionTokenLifetime);
  650. newToken = new SecurityContextSecurityToken(contextId, id, proofKey, tokenEffectiveTime, tokenExpirationTime, null, keyEffectiveTime,
  651. keyExpirationTime, authorizationPolicies);
  652. if (this.preserveBootstrapTokens)
  653. {
  654. newToken.BootstrapMessageProperty = (securityProperty == null) ? null : (SecurityMessageProperty)securityProperty.CreateCopy();
  655. SecurityUtils.ErasePasswordInUsernameTokenIfPresent(newToken.BootstrapMessageProperty);
  656. }
  657. }
  658. rstr = new RequestSecurityTokenResponse(this.standardsManager);
  659. rstr.Context = rst.Context;
  660. rstr.KeySize = issuedKeySize;
  661. rstr.RequestedUnattachedReference = this.IssuedSecurityTokenParameters.CreateKeyIdentifierClause(newToken, SecurityTokenReferenceStyle.External);
  662. rstr.RequestedAttachedReference = this.IssuedSecurityTokenParameters.CreateKeyIdentifierClause(newToken, SecurityTokenReferenceStyle.Internal);
  663. rstr.TokenType = this.sctUri;
  664. rstr.RequestedSecurityToken = newToken;
  665. if (issuerEntropy != null)
  666. {
  667. rstr.SetIssuerEntropy(issuerEntropy);
  668. rstr.ComputeKey = true;
  669. }
  670. if (proofToken != null)
  671. {
  672. rstr.RequestedProofToken = proofToken;
  673. }
  674. rstr.SetLifetime(keyEffectiveTime, keyExpirationTime);
  675. return newToken;
  676. }
  677. static SecurityTokenSpecification GetMatchingEndorsingSct(SecurityContextKeyIdentifierClause sctSkiClause, SecurityMessageProperty supportingTokenProperty)
  678. {
  679. if (sctSkiClause == null)
  680. {
  681. return null;
  682. }
  683. for (int i = 0; i < supportingTokenProperty.IncomingSupportingTokens.Count; ++i)
  684. {
  685. if (supportingTokenProperty.IncomingSupportingTokens[i].SecurityTokenAttachmentMode != SecurityTokenAttachmentMode.Endorsing
  686. && supportingTokenProperty.IncomingSupportingTokens[i].SecurityTokenAttachmentMode != SecurityTokenAttachmentMode.SignedEndorsing)
  687. {
  688. continue;
  689. }
  690. SecurityContextSecurityToken sct = supportingTokenProperty.IncomingSupportingTokens[i].SecurityToken as SecurityContextSecurityToken;
  691. if (sct != null && sctSkiClause.Matches(sct.ContextId, sct.KeyGeneration))
  692. {
  693. return supportingTokenProperty.IncomingSupportingTokens[i];
  694. }
  695. }
  696. return null;
  697. }
  698. protected virtual Message ProcessRenewRequest(Message request)
  699. {
  700. this.CommunicationObject.ThrowIfClosedOrNotOpen();
  701. try
  702. {
  703. // first verify that the session token being renewed is present as a supportingToken
  704. SecurityMessageProperty supportingTokenProperty = request.Properties.Security;
  705. if (supportingTokenProperty == null || !supportingTokenProperty.HasIncomingSupportingTokens)
  706. {
  707. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.RenewSessionMissingSupportingToken)), request);
  708. }
  709. RequestSecurityToken rst;
  710. XmlDictionaryReader bodyReader = request.GetReaderAtBodyContents();
  711. using (bodyReader)
  712. {
  713. rst = this.StandardsManager.TrustDriver.CreateRequestSecurityToken(bodyReader);
  714. request.ReadFromBodyContentsToEnd(bodyReader);
  715. }
  716. if (rst.RequestType != this.StandardsManager.TrustDriver.RequestTypeRenew)
  717. {
  718. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.InvalidRstRequestType, rst.RequestType)), request);
  719. }
  720. if (rst.RenewTarget == null)
  721. {
  722. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.NoRenewTargetSpecified)), request);
  723. }
  724. SecurityContextKeyIdentifierClause sctSkiClause = rst.RenewTarget as SecurityContextKeyIdentifierClause;
  725. SecurityTokenSpecification sessionToken = GetMatchingEndorsingSct(sctSkiClause, supportingTokenProperty);
  726. if (sctSkiClause == null || sessionToken == null)
  727. {
  728. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.BadRenewTarget, rst.RenewTarget)), request);
  729. }
  730. RequestSecurityTokenResponse rstr;
  731. SecurityContextSecurityToken newToken = this.IssueToken(rst, request, (SecurityContextSecurityToken)sessionToken.SecurityToken, sessionToken.SecurityTokenPolicies, out rstr);
  732. rstr.MakeReadOnly();
  733. BodyWriter replyMessage = rstr;
  734. if (this.StandardsManager.MessageSecurityVersion.TrustVersion == TrustVersion.WSTrust13)
  735. {
  736. List<RequestSecurityTokenResponse> rstrList = new List<RequestSecurityTokenResponse>(1);
  737. rstrList.Add(rstr);
  738. RequestSecurityTokenResponseCollection rstrc = new RequestSecurityTokenResponseCollection(rstrList, this.StandardsManager);
  739. replyMessage = rstrc;
  740. }
  741. this.NotifyOperationCompletion(SecuritySessionOperation.Renew, newToken, (SecurityContextSecurityToken)sessionToken.SecurityToken, request.Headers.ReplyTo);
  742. Message response = CreateReply(request, this.RenewResponseAction, replyMessage);
  743. if (!newToken.IsCookieMode)
  744. {
  745. this.issuedTokenCache.AddContext(newToken);
  746. }
  747. return response;
  748. }
  749. finally
  750. {
  751. RemoveCachedTokensIfRequired(request.Properties.Security);
  752. }
  753. }
  754. static void AddTokenToRemoveIfRequired(SecurityToken token, Collection<SecurityContextSecurityToken> sctsToRemove)
  755. {
  756. SecurityContextSecurityToken sct = token as SecurityContextSecurityToken;
  757. if (sct != null)
  758. {
  759. sctsToRemove.Add(sct);
  760. }
  761. }
  762. internal static void RemoveCachedTokensIfRequired(SecurityMessageProperty security)
  763. {
  764. if (security == null)
  765. {
  766. return;
  767. }
  768. ILogonTokenCacheManager logonManager = OperationContext.Current.EndpointDispatcher.ChannelDispatcher.Listener.GetProperty<ILogonTokenCacheManager>();
  769. Collection<ISecurityContextSecurityTokenCache> sctCaches = OperationContext.Current.EndpointDispatcher.ChannelDispatcher.Listener.GetProperty<Collection<ISecurityContextSecurityTokenCache>>();
  770. if (logonManager == null && (sctCaches == null || sctCaches.Count == 0))
  771. {
  772. return;
  773. }
  774. Collection<SecurityContextSecurityToken> securityContextTokensToRemove = new Collection<SecurityContextSecurityToken>();
  775. if (security.ProtectionToken != null)
  776. {
  777. AddTokenToRemoveIfRequired(security.ProtectionToken.SecurityToken, securityContextTokensToRemove);
  778. }
  779. if (security.InitiatorToken != null)
  780. {
  781. AddTokenToRemoveIfRequired(security.InitiatorToken.SecurityToken, securityContextTokensToRemove);
  782. }
  783. if (security.HasIncomingSupportingTokens)
  784. {
  785. for (int i = 0; i < security.IncomingSupportingTokens.Count; ++i)
  786. {
  787. if (security.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachmentMode.Endorsing
  788. || security.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachmentMode.SignedEncrypted
  789. || security.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachmentMode.SignedEndorsing)
  790. {
  791. AddTokenToRemoveIfRequired(security.IncomingSupportingTokens[i].SecurityToken, securityContextTokensToRemove);
  792. }
  793. }
  794. }
  795. if (sctCaches != null)
  796. {
  797. for (int i = 0; i < securityContextTokensToRemove.Count; ++i)
  798. {
  799. for (int j = 0; j < sctCaches.Count; ++j)
  800. {
  801. sctCaches[j].RemoveContext(securityContextTokensToRemove[i].ContextId, securityContextTokensToRemove[i].KeyGeneration);
  802. }
  803. }
  804. }
  805. }
  806. protected virtual Message ProcessIssueRequest(Message request)
  807. {
  808. this.CommunicationObject.ThrowIfClosedOrNotOpen();
  809. try
  810. {
  811. RequestSecurityToken rst;
  812. using (XmlDictionaryReader bodyReader = request.GetReaderAtBodyContents())
  813. {
  814. rst = this.StandardsManager.TrustDriver.CreateRequestSecurityToken(bodyReader);
  815. request.ReadFromBodyContentsToEnd(bodyReader);
  816. }
  817. if (rst.RequestType != null && rst.RequestType != this.StandardsManager.TrustDriver.RequestTypeIssue)
  818. {
  819. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.InvalidRstRequestType, rst.RequestType)), request);
  820. }
  821. // echo the AppliesTo in the reply if it is an issue request
  822. EndpointAddress appliesTo;
  823. DataContractSerializer appliesToSerializer;
  824. string appliesToName;
  825. string appliesToNamespace;
  826. rst.GetAppliesToQName(out appliesToName, out appliesToNamespace);
  827. if (appliesToName == AddressingStrings.EndpointReference && appliesToNamespace == request.Version.Addressing.Namespace)
  828. {
  829. if (request.Version.Addressing == AddressingVersion.WSAddressing10)
  830. {
  831. appliesToSerializer = DataContractSerializerDefaults.CreateSerializer(typeof(EndpointAddress10), DataContractSerializerDefaults.MaxItemsInObjectGraph);
  832. appliesTo = rst.GetAppliesTo<EndpointAddress10>(appliesToSerializer).ToEndpointAddress();
  833. }
  834. else if (request.Version.Addressing == AddressingVersion.WSAddressingAugust2004)
  835. {
  836. appliesToSerializer = DataContractSerializerDefaults.CreateSerializer(typeof(EndpointAddressAugust2004), DataContractSerializerDefaults.MaxItemsInObjectGraph);
  837. appliesTo = rst.GetAppliesTo<EndpointAddressAugust2004>(appliesToSerializer).ToEndpointAddress();
  838. }
  839. else
  840. {
  841. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
  842. new ProtocolException(SR.GetString(SR.AddressingVersionNotSupported, request.Version.Addressing)));
  843. }
  844. }
  845. else
  846. {
  847. appliesTo = null;
  848. appliesToSerializer = null;
  849. }
  850. if (this.shouldMatchRstWithEndpointFilter)
  851. {
  852. SecurityUtils.MatchRstWithEndpointFilter(request, this.endpointFilterTable, this.listenUri);
  853. }
  854. RequestSecurityTokenResponse rstr;
  855. SecurityContextSecurityToken issuedToken = this.IssueToken(rst, request, null, null, out rstr);
  856. if (appliesTo != null)
  857. {
  858. if (request.Version.Addressing == AddressingVersion.WSAddressing10)
  859. {
  860. rstr.SetAppliesTo<EndpointAddress10>(EndpointAddress10.FromEndpointAddress(appliesTo), appliesToSerializer);
  861. }
  862. else if (request.Version.Addressing == AddressingVersion.WSAddressingAugust2004)
  863. {
  864. rstr.SetAppliesTo<EndpointAddressAugust2004>(EndpointAddressAugust2004.FromEndpointAddress(appliesTo), appliesToSerializer);
  865. }
  866. else
  867. {
  868. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
  869. new ProtocolException(SR.GetString(SR.AddressingVersionNotSupported, request.Version.Addressing)));
  870. }
  871. }
  872. rstr.MakeReadOnly();
  873. BodyWriter replyMessage = rstr;
  874. if (this.StandardsManager.MessageSecurityVersion.TrustVersion == TrustVersion.WSTrust13)
  875. {
  876. List<RequestSecurityTokenResponse> rstrList = new List<RequestSecurityTokenResponse>(1);
  877. rstrList.Add(rstr);
  878. RequestSecurityTokenResponseCollection rstrc = new RequestSecurityTokenResponseCollection(rstrList, this.StandardsManager);
  879. replyMessage = rstrc;
  880. }
  881. this.NotifyOperationCompletion(SecuritySessionOperation.Issue, issuedToken, null, request.Headers.ReplyTo);
  882. Message response = CreateReply(request, this.IssueResponseAction, replyMessage);
  883. if (!issuedToken.IsCookieMode)
  884. {
  885. this.issuedTokenCache.AddContext(issuedToken);
  886. }
  887. return response;
  888. }
  889. finally
  890. {
  891. RemoveCachedTokensIfRequired(request.Properties.Security);
  892. }
  893. }
  894. internal static bool DoesSkiClauseMatchSigningToken(SecurityContextKeyIdentifierClause skiClause, Message request)
  895. {
  896. SecurityMessageProperty securityProperty = request.Properties.Security;
  897. if (securityProperty == null)
  898. {
  899. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.SFxSecurityContextPropertyMissingFromRequestMessage)), request);
  900. }
  901. SecurityContextSecurityToken sct = (securityProperty.ProtectionToken != null) ? (securityProperty.ProtectionToken.SecurityToken as SecurityContextSecurityToken) : null;
  902. if (sct != null && skiClause.Matches(sct.ContextId, sct.KeyGeneration))
  903. {
  904. return true;
  905. }
  906. if (securityProperty.HasIncomingSupportingTokens)
  907. {
  908. for (int i = 0; i < securityProperty.IncomingSupportingTokens.Count; ++i)
  909. {
  910. if (securityProperty.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachmentMode.Endorsing)
  911. {
  912. sct = securityProperty.IncomingSupportingTokens[i].SecurityToken as SecurityContextSecurityToken;
  913. if (sct != null && skiClause.Matches(sct.ContextId, sct.KeyGeneration))
  914. {
  915. return true;
  916. }
  917. }
  918. }
  919. }
  920. return false;
  921. }
  922. static Message CreateReply(Message request, XmlDictionaryString action, BodyWriter body)
  923. {
  924. if (request.Headers.MessageId != null)
  925. {
  926. Message reply = Message.CreateMessage(request.Version, ActionHeader.Create(action, request.Version.Addressing), body);
  927. reply.InitializeReply(request);
  928. return reply;
  929. }
  930. else
  931. {
  932. // the message id may not be present if MapToHttp is true
  933. return Message.CreateMessage(request.Version, ActionHeader.Create(action, request.Version.Addressing), body);
  934. }
  935. }
  936. Message ProcessRequest(Message request)
  937. {
  938. SecuritySessionOperation operation = SecuritySessionOperation.None;
  939. try
  940. {
  941. if (request == null)
  942. {
  943. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("request");
  944. }
  945. if (request.Headers.Action == this.IssueAction.Value)
  946. {
  947. operation = SecuritySessionOperation.Issue;
  948. return this.ProcessIssueRequest(request);
  949. }
  950. else if (request.Headers.Action == this.RenewAction.Value)
  951. {
  952. operation = SecuritySessionOperation.Renew;
  953. return this.ProcessRenewRequest(request);
  954. }
  955. else
  956. {
  957. throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.InvalidActionForNegotiationMessage, request.Headers.Action)), request);
  958. }
  959. }
  960. catch (Exception e)
  961. {
  962. if (Fx.IsFatal(e))
  963. {
  964. throw;
  965. }
  966. return this.HandleOperationException(operation, request, e);
  967. }
  968. }
  969. internal ServiceHostBase RequestSecurityTokenListener
  970. {
  971. get
  972. {
  973. return this.rstListener;
  974. }
  975. }
  976. void SetupSessionListener()
  977. {
  978. ChannelBuilder channelBuilder = new ChannelBuilder(this.IssuerBindingContext, true);
  979. channelBuilder.Binding.Elements.Insert(0, new ReplyAdapterBindingElement());
  980. channelBuilder.Binding.Elements.Insert(0, new SecuritySessionAuthenticatorBindingElement(this));
  981. List<string> supportedMessageActions = new List<string>();
  982. supportedMessageActions.Add(this.IssueAction.Value);
  983. supportedMessageActions.Add(this.RenewAction.Value);
  984. SecurityBindingElement securityBindingElement = this.IssuerBindingContext.Binding.Elements.Find<SecurityBindingElement>();
  985. foreach (SecurityTokenParameters stp in new SecurityTokenParametersEnumerable(securityBindingElement))
  986. {
  987. if (stp is SecureConversationSecurityTokenParameters)
  988. {
  989. SecureConversationSecurityTokenParameters scstp = (SecureConversationSecurityTokenParameters)stp;
  990. if (!scstp.CanRenewSession)
  991. {
  992. supportedMessageActions.Remove(this.RenewAction.Value);
  993. break;
  994. }
  995. }
  996. }
  997. MessageFilter issueAndRenewFilter = new SessionActionFilter(this.standardsManager, supportedMessageActions.ToArray());
  998. SecuritySessionHost sessionListener = new SecuritySessionHost(this, issueAndRenewFilter, this.ListenUri, channelBuilder);
  999. this.rstListener = sessionListener;
  1000. }
  1001. internal IChannelListener<TChannel> BuildResponderChannelListener<TChannel>(BindingContext context)
  1002. where TChannel : class, IChannel
  1003. {
  1004. SecurityCredentialsManager securityCredentials = this.IssuerBindingContext.BindingParameters.Find<SecurityCredentialsManager>();
  1005. if (securityCredentials == null)
  1006. {
  1007. securityCredentials = ServiceCredentials.CreateDefaultCredentials();
  1008. }
  1009. this.bootstrapSecurityBindingElement.ReaderQuotas = this.IssuerBindingContext.GetInnerProperty<XmlDictionaryReaderQuotas>();
  1010. if (this.bootstrapSecurityBindingElement.ReaderQuotas == null)
  1011. {
  1012. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.EncodingBindingElementDoesNotHandleReaderQuotas)));
  1013. }
  1014. TransportBindingElement transportBindingElement = context.RemainingBindingElements.Find<TransportBindingElement>();
  1015. if (transportBindingElement != null)
  1016. this.bootstrapSecurityBindingElement.MaxReceivedMessageSize = transportBindingElement.MaxReceivedMessageSize;
  1017. SecurityProtocolFactory bootstrapSecurityProtocolFactory = this.bootstrapSecurityBindingElement.CreateSecurityProtocolFactory<TChannel>(this.IssuerBindingContext.Clone(), securityCredentials, true, this.IssuerBindingContext.Clone());
  1018. if (bootstrapSecurityProtocolFactory is MessageSecurityProtocolFactory)
  1019. {
  1020. MessageSecurityProtocolFactory soapBindingFactory = (MessageSecurityProtocolFactory)bootstrapSecurityProtocolFactory;
  1021. soapBindingFactory.ApplyConfidentiality = soapBindingFactory.ApplyIntegrity
  1022. = soapBindingFactory.RequireConfidentiality = soapBindingFactory.RequireIntegrity = true;
  1023. soapBindingFactory.ProtectionRequirements.IncomingSignatureParts.ChannelParts.IsBodyIncluded = true;
  1024. soapBindingFactory.ProtectionRequirements.OutgoingSignatureParts.ChannelParts.IsBodyIncluded = true;
  1025. MessagePartSpecification bodyPart = new MessagePartSpecification(true);
  1026. soapBindingFactory.ProtectionRequirements.OutgoingSignatureParts.AddParts(bodyPart, this.IssueResponseAction);
  1027. soapBindingFactory.ProtectionRequirements.OutgoingEncryptionParts.AddParts(bodyPart, this.IssueResponseAction);
  1028. soapBindingFactory.ProtectionRequirements.OutgoingSignatureParts.AddParts(bodyPart, this.RenewResponseAction);
  1029. soapBindingFactory.ProtectionRequirements.OutgoingEncryptionParts.AddParts(bodyPart, this.RenewResponseAction);
  1030. soapBindingFactory.ProtectionRequirements.IncomingSignatureParts.AddParts(bodyPart, this.IssueAction);
  1031. soapBindingFactory.ProtectionRequirements.IncomingEncryptionParts.AddParts(bodyPart, this.IssueAction);
  1032. soapBindingFactory.ProtectionRequirements.IncomingSignatureParts.AddParts(bodyPart, this.RenewAction);
  1033. soapBindingFactory.ProtectionRequirements.IncomingEncryptionParts.AddParts(bodyPart, this.RenewAction);
  1034. }
  1035. SupportingTokenParameters renewSupportingTokenParameters = new SupportingTokenParameters();
  1036. SecurityContextSecurityTokenParameters sctParameters = new SecurityContextSecurityTokenParameters();
  1037. sctParameters.RequireDerivedKeys = this.IssuedSecurityTokenParameters.RequireDerivedKeys;
  1038. renewSupportingTokenParameters.Endorsing.Add(sctParameters);
  1039. bootstrapSecurityProtocolFactory.SecurityBindingElement.OperationSupportingTokenParameters.Add(this.RenewAction.Value, renewSupportingTokenParameters);
  1040. bootstrapSecurityProtocolFactory.SecurityTokenManager = new SessionRenewSecurityTokenManager(bootstrapSecurityProtocolFactory.SecurityTokenManager, this.sessionTokenAuthenticator, (SecurityTokenResolver)this.IssuedTokenCache);
  1041. SecurityChannelListener<TChannel> securityChannelListener = new SecurityChannelListener<TChannel>(
  1042. this.bootstrapSecurityBindingElement, this.IssuerBindingContext);
  1043. securityChannelListener.SecurityProtocolFactory = bootstrapSecurityProtocolFactory;
  1044. securityChannelListener.SendUnsecuredFaults = !SecurityUtils.IsCompositeDuplexBinding(context);
  1045. ChannelBuilder channelBuilder = new ChannelBuilder(context, true);
  1046. securityChannelListener.InitializeListener(channelBuilder);
  1047. this.shouldMatchRstWithEndpointFilter = SecurityUtils.ShouldMatchRstWithEndpointFilter(this.bootstrapSecurityBindingElement);
  1048. return securityChannelListener;
  1049. }
  1050. class SecuritySessionHost : ServiceHostBase
  1051. {
  1052. ChannelBuilder channelBuilder;
  1053. MessageFilter filter;
  1054. Uri listenUri;
  1055. SecuritySessionSecurityTokenAuthenticator authenticator;
  1056. public SecuritySessionHost(SecuritySessionSecurityTokenAuthenticator authenticator, MessageFilter filter, Uri listenUri, ChannelBuilder channelBuilder)
  1057. {
  1058. this.authenticator = authenticator;
  1059. this.filter = filter;
  1060. this.listenUri = listenUri;
  1061. this.channelBuilder = channelBuilder;
  1062. }
  1063. protected override ServiceDescription CreateDescription(out IDictionary<string, ContractDescription> implementedContracts)
  1064. {
  1065. implementedContracts = null;
  1066. return null;
  1067. }
  1068. protected override void InitializeRuntime()
  1069. {
  1070. MessageFilter contractFilter = this.filter;
  1071. int filterPriority = Int32.MaxValue - 10;
  1072. Type[] endpointChannelTypes = new Type[] { typeof(IReplyChannel),
  1073. typeof(IDuplexChannel),
  1074. typeof(IReplySessionChannel),
  1075. typeof(IDuplexSessionChannel) };
  1076. IChannelListener listener = null;
  1077. BindingParameterCollection parameters = new BindingParameterCollection(this.channelBuilder.BindingParameters);
  1078. Binding binding = this.channelBuilder.Binding;
  1079. binding.ReceiveTimeout = this.authenticator.NegotiationTimeout;
  1080. parameters.Add(new ChannelDemuxerFilter(contractFilter, filterPriority));
  1081. DispatcherBuilder.MaybeCreateListener(true, endpointChannelTypes, binding, parameters,
  1082. this.listenUri, "", ListenUriMode.Explicit, this.ServiceThrottle, out listener);
  1083. if (listener == null)
  1084. {
  1085. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.CannotCreateTwoWayListenerForNegotiation)));
  1086. }
  1087. ChannelDispatcher channelDispatcher = new ChannelDispatcher(listener, null, binding);
  1088. channelDispatcher.MessageVersion = binding.MessageVersion;
  1089. channelDispatcher.ManualAddressing = true;
  1090. channelDispatcher.ServiceThrottle = new ServiceThrottle(this);
  1091. channelDispatcher.ServiceThrottle.MaxConcurrentCalls = this.authenticator.MaximumConcurrentNegotiations;
  1092. channelDispatcher.ServiceThrottle.MaxConcurrentSessions = this.authenticator.MaximumConcurrentNegotiations;
  1093. EndpointDispatcher endpointDispatcher = new EndpointDispatcher(new EndpointAddress(this.listenUri), "IssueAndRenewSession", NamingHelper.DefaultNamespace, true);
  1094. endpointDispatcher.DispatchRuntime.SingletonInstanceContext = new InstanceContext(null, this.authenticator, false);
  1095. endpointDispatcher.DispatchRuntime.ConcurrencyMode = ConcurrencyMode.Multiple;
  1096. endpointDispatcher.AddressFilter = new MatchAllMessageFilter();
  1097. endpointDispatcher.ContractFilter = contractFilter;
  1098. endpointDispatcher.FilterPriority = filterPriority;
  1099. endpointDispatcher.DispatchRuntime.PrincipalPermissionMode = PrincipalPermissionMode.None;
  1100. endpointDispatcher.DispatchRuntime.InstanceContextProvider = new SingletonInstanceContextProvider(endpointDispatcher.DispatchRuntime);
  1101. endpointDispatcher.DispatchRuntime.SynchronizationContext = null;
  1102. if (this.authenticator.IssuerBindingContext != null && this.authenticator.IssuerBindingContext.BindingParameters != null)
  1103. {
  1104. ServiceAuthenticationManager serviceAuthenticationManager = this.authenticator.IssuerBindingContext.BindingParameters.Find<ServiceAuthenticationManager>();
  1105. if (serviceAuthenticationManager != null)
  1106. {
  1107. endpointDispatcher.DispatchRuntime.ServiceAuthenticationManager = new SCTServiceAuthenticationManagerWrapper(serviceAuthenticationManager);
  1108. }
  1109. }
  1110. DispatchOperation operation = new DispatchOperation(endpointDispatcher.DispatchRuntime, "*", MessageHeaders.WildcardAction, MessageHeaders.WildcardAction);
  1111. operation.Formatter = new MessageOperationFormatter();
  1112. operation.Invoker = new SecuritySessionAuthenticatorInvoker(this.authenticator);
  1113. endpointDispatcher.DispatchRuntime.UnhandledDispatchOperation = operation;
  1114. channelDispatcher.Endpoints.Add(endpointDispatcher);
  1115. this.ChannelDispatchers.Add(channelDispatcher);
  1116. }
  1117. class SecuritySessionAuthenticatorInvoker : IOperationInvoker
  1118. {
  1119. SecuritySessionSecurityTokenAuthenticator parent;
  1120. internal SecuritySessionAuthenticatorInvoker(SecuritySessionSecurityTokenAuthenticator parent)
  1121. {
  1122. this.parent = parent;
  1123. }
  1124. public bool IsSynchronous { get { return true; } }
  1125. public object[] AllocateInputs()
  1126. {
  1127. return EmptyArray<object>.Allocate(1);
  1128. }
  1129. public object Invoke(object instance, object[] inputs, out object[] outputs)
  1130. {
  1131. outputs = EmptyArray<object>.Allocate(0);
  1132. return parent.ProcessRequest((Message)inputs[0]);
  1133. }
  1134. public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
  1135. {
  1136. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotImplementedException());
  1137. }
  1138. public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
  1139. {
  1140. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotImplementedException());
  1141. }
  1142. }
  1143. }
  1144. class SecuritySessionAuthenticatorBindingElement : BindingElement
  1145. {
  1146. SecuritySessionSecurityTokenAuthenticator authenticator;
  1147. public SecuritySessionAuthenticatorBindingElement(SecuritySessionSecurityTokenAuthenticator authenticator)
  1148. {
  1149. this.authenticator = authenticator;
  1150. }
  1151. public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
  1152. {
  1153. if (context == null)
  1154. {
  1155. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
  1156. }
  1157. return authenticator.BuildResponderChannelListener<TChannel>(context);
  1158. }
  1159. public override BindingElement Clone()
  1160. {
  1161. return new SecuritySessionAuthenticatorBindingElement(this.authenticator);
  1162. }
  1163. public override T GetProperty<T>(BindingContext context)
  1164. {
  1165. if (typeof(T) == typeof(ISecurityCapabilities))
  1166. {
  1167. return (T)(object)authenticator.BootstrapSecurityBindingElement.GetProperty<ISecurityCapabilities>(context);
  1168. }
  1169. return context.GetInnerProperty<T>();
  1170. }
  1171. }
  1172. public class SessionRenewSecurityTokenManager : SecurityTokenManager
  1173. {
  1174. SecurityTokenManager innerTokenManager;
  1175. SecurityTokenAuthenticator renewTokenAuthenticator;
  1176. SecurityTokenResolver renewTokenResolver;
  1177. public SessionRenewSecurityTokenManager(SecurityTokenManager innerTokenManager, SecurityTokenAuthenticator renewTokenAuthenticator,
  1178. SecurityTokenResolver renewTokenResolver)
  1179. {
  1180. this.innerTokenManager = innerTokenManager;
  1181. this.renewTokenAuthenticator = renewTokenAuthenticator;
  1182. this.renewTokenResolver = renewTokenResolver;
  1183. }
  1184. public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
  1185. {
  1186. if (tokenRequirement == null)
  1187. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("tokenRequirement");
  1188. if (tokenRequirement.TokenType == ServiceModelSecurityTokenTypes.SecurityContext)
  1189. {
  1190. outOfBandTokenResolver = this.renewTokenResolver;
  1191. return this.renewTokenAuthenticator;
  1192. }
  1193. else
  1194. {
  1195. return this.innerTokenManager.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
  1196. }
  1197. }
  1198. public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement requirement)
  1199. {
  1200. return this.innerTokenManager.CreateSecurityTokenProvider(requirement);
  1201. }
  1202. public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
  1203. {
  1204. return this.innerTokenManager.CreateSecurityTokenSerializer(version);
  1205. }
  1206. }
  1207. }
  1208. class SessionActionFilter : HeaderFilter
  1209. {
  1210. SecurityStandardsManager standardsManager;
  1211. string[] actions;
  1212. public SessionActionFilter(SecurityStandardsManager standardsManager, params string[] actions)
  1213. {
  1214. this.actions = actions;
  1215. this.standardsManager = standardsManager;
  1216. }
  1217. public override bool Match(Message message)
  1218. {
  1219. for (int i = 0; i < this.actions.Length; ++i)
  1220. {
  1221. if (message.Headers.Action == this.actions[i])
  1222. {
  1223. return this.standardsManager.DoesMessageContainSecurityHeader(message);
  1224. }
  1225. }
  1226. return false;
  1227. }
  1228. }
  1229. }