SecurityContextSecurityToken.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //
  2. // SecurityContextSecretSecurityToken.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // Copyright (C) 2006-2007 Novell, Inc. http://www.novell.com
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.Collections.ObjectModel;
  30. using System.Xml;
  31. using System.IdentityModel.Policy;
  32. using System.IdentityModel.Tokens;
  33. namespace System.ServiceModel.Security.Tokens
  34. {
  35. public class SecurityContextSecurityToken : SecurityToken
  36. {
  37. #region Static members
  38. public static SecurityContextSecurityToken CreateCookieSecurityContextToken (
  39. UniqueId contextId,
  40. string id,
  41. byte [] key,
  42. DateTime validFrom,
  43. DateTime validTo,
  44. ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies,
  45. SecurityStateEncoder securityStateEncoder)
  46. {
  47. return CreateCookieSecurityContextToken (
  48. contextId, id, key, validFrom, validTo, new UniqueId (Guid.NewGuid ()), validFrom, validTo, authorizationPolicies, securityStateEncoder);
  49. }
  50. public static SecurityContextSecurityToken CreateCookieSecurityContextToken (
  51. UniqueId contextId,
  52. string id,
  53. byte [] key,
  54. DateTime validFrom,
  55. DateTime validTo,
  56. UniqueId keyGeneration,
  57. DateTime keyEffectiveTime,
  58. DateTime keyExpirationTime,
  59. ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies,
  60. SecurityStateEncoder securityStateEncoder)
  61. {
  62. if (securityStateEncoder == null)
  63. throw new ArgumentNullException ("securityStateEncoder");
  64. SecurityContextSecurityToken sct = new SecurityContextSecurityToken (
  65. contextId, id, key, validFrom, validTo,
  66. keyGeneration, keyEffectiveTime,
  67. keyExpirationTime, authorizationPolicies);
  68. byte [] rawdata = SslnegoCookieResolver.CreateData (
  69. contextId, keyGeneration, key,
  70. validFrom, validTo,
  71. keyEffectiveTime, keyExpirationTime);
  72. sct.cookie = securityStateEncoder.EncodeSecurityState (rawdata);
  73. return sct;
  74. }
  75. #endregion
  76. string id;
  77. InMemorySymmetricSecurityKey key;
  78. ReadOnlyCollection<SecurityKey> keys;
  79. DateTime token_since, token_until, key_since, key_until;
  80. UniqueId context_id, key_generation;
  81. ReadOnlyCollection<IAuthorizationPolicy> policies;
  82. byte [] cookie;
  83. public SecurityContextSecurityToken (
  84. UniqueId contextId,
  85. byte[] key,
  86. DateTime validFrom,
  87. DateTime validTo)
  88. : this (contextId, new UniqueId ().ToString (), key, validFrom, validTo)
  89. {
  90. }
  91. public SecurityContextSecurityToken (
  92. UniqueId contextId,
  93. string id,
  94. byte[] key,
  95. DateTime validFrom,
  96. DateTime validTo)
  97. : this (contextId, id, key, validFrom, validTo, null)
  98. {
  99. }
  100. public SecurityContextSecurityToken (
  101. UniqueId contextId,
  102. string id,
  103. byte[] key,
  104. DateTime validFrom,
  105. DateTime validTo,
  106. ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies)
  107. {
  108. context_id = contextId;
  109. this.id = id;
  110. this.key = new InMemorySymmetricSecurityKey (key);
  111. token_since = validFrom;
  112. token_until = validTo;
  113. if (authorizationPolicies == null)
  114. authorizationPolicies = new ReadOnlyCollection<IAuthorizationPolicy> (new Collection<IAuthorizationPolicy> ());
  115. policies = authorizationPolicies;
  116. }
  117. public SecurityContextSecurityToken (
  118. UniqueId contextId,
  119. string id,
  120. byte[] key,
  121. DateTime validFrom,
  122. DateTime validTo,
  123. UniqueId keyGeneration,
  124. DateTime keyEffectiveTime,
  125. DateTime keyExpirationTime,
  126. ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies)
  127. : this (contextId, id, key, validFrom, validTo, authorizationPolicies)
  128. {
  129. key_generation = keyGeneration;
  130. key_since = keyEffectiveTime;
  131. key_until = keyExpirationTime;
  132. }
  133. public ReadOnlyCollection<IAuthorizationPolicy> AuthorizationPolicies {
  134. get { return policies; }
  135. }
  136. public UniqueId ContextId {
  137. get { return context_id; }
  138. }
  139. public UniqueId KeyGeneration {
  140. get { return key_generation; }
  141. }
  142. public DateTime KeyEffectiveTime {
  143. get { return key_since; }
  144. }
  145. public DateTime KeyExpirationTime {
  146. get { return key_until; }
  147. }
  148. public override DateTime ValidFrom {
  149. get { return token_since; }
  150. }
  151. public override DateTime ValidTo {
  152. get { return token_until; }
  153. }
  154. public override string Id {
  155. get { return id; }
  156. }
  157. public override ReadOnlyCollection<SecurityKey> SecurityKeys {
  158. get {
  159. if (keys == null)
  160. keys = new ReadOnlyCollection<SecurityKey> (new SecurityKey [] {key});
  161. return keys;
  162. }
  163. }
  164. internal byte [] Cookie {
  165. get { return cookie; }
  166. set { cookie = value; }
  167. }
  168. public override bool CanCreateKeyIdentifierClause<T> ()
  169. {
  170. return typeof (T) == typeof (SecurityContextKeyIdentifierClause);
  171. }
  172. public override T CreateKeyIdentifierClause<T> ()
  173. {
  174. Type t = typeof (T);
  175. if (t == typeof (SecurityContextKeyIdentifierClause))
  176. return (T) (object) new SecurityContextKeyIdentifierClause (ContextId, KeyGeneration);
  177. throw new NotSupportedException (String.Format ("X509SecurityToken does not support creation of {0}.", t));
  178. }
  179. public override bool MatchesKeyIdentifierClause (SecurityKeyIdentifierClause clause)
  180. {
  181. SecurityContextKeyIdentifierClause sctic =
  182. clause as SecurityContextKeyIdentifierClause;
  183. return sctic != null && sctic.ContextId == ContextId &&
  184. sctic.Generation == KeyGeneration;
  185. }
  186. [MonoTODO]
  187. public override string ToString ()
  188. {
  189. return base.ToString ();
  190. }
  191. }
  192. }