ServiceSecurityContext.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System;
  7. using System.ServiceModel.Channels;
  8. using System.ServiceModel.Security;
  9. using System.IdentityModel.Claims;
  10. using System.IdentityModel.Policy;
  11. using System.IdentityModel.Tokens;
  12. using System.Collections;
  13. using System.Collections.Generic;
  14. using System.Collections.ObjectModel;
  15. using System.Security.Principal;
  16. public class ServiceSecurityContext
  17. {
  18. static ServiceSecurityContext anonymous;
  19. ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies;
  20. AuthorizationContext authorizationContext;
  21. IIdentity primaryIdentity;
  22. Claim identityClaim;
  23. WindowsIdentity windowsIdentity;
  24. // Perf: delay created authorizationContext using forward chain.
  25. public ServiceSecurityContext(ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies)
  26. {
  27. if (authorizationPolicies == null)
  28. {
  29. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("authorizationPolicies");
  30. }
  31. this.authorizationContext = null;
  32. this.authorizationPolicies = authorizationPolicies;
  33. }
  34. public ServiceSecurityContext(AuthorizationContext authorizationContext)
  35. : this(authorizationContext, EmptyReadOnlyCollection<IAuthorizationPolicy>.Instance)
  36. {
  37. }
  38. public ServiceSecurityContext(AuthorizationContext authorizationContext, ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies)
  39. {
  40. if (authorizationContext == null)
  41. {
  42. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("authorizationContext");
  43. }
  44. if (authorizationPolicies == null)
  45. {
  46. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("authorizationPolicies");
  47. }
  48. this.authorizationContext = authorizationContext;
  49. this.authorizationPolicies = authorizationPolicies;
  50. }
  51. public static ServiceSecurityContext Anonymous
  52. {
  53. get
  54. {
  55. if (anonymous == null)
  56. {
  57. anonymous = new ServiceSecurityContext(EmptyReadOnlyCollection<IAuthorizationPolicy>.Instance);
  58. }
  59. return anonymous;
  60. }
  61. }
  62. public static ServiceSecurityContext Current
  63. {
  64. get
  65. {
  66. ServiceSecurityContext result = null;
  67. OperationContext operationContext = OperationContext.Current;
  68. if (operationContext != null)
  69. {
  70. MessageProperties properties = operationContext.IncomingMessageProperties;
  71. if (properties != null)
  72. {
  73. SecurityMessageProperty security = properties.Security;
  74. if (security != null)
  75. {
  76. result = security.ServiceSecurityContext;
  77. }
  78. }
  79. }
  80. return result;
  81. }
  82. }
  83. public bool IsAnonymous
  84. {
  85. get
  86. {
  87. return this == Anonymous || this.IdentityClaim == null;
  88. }
  89. }
  90. internal Claim IdentityClaim
  91. {
  92. get
  93. {
  94. if (this.identityClaim == null)
  95. {
  96. this.identityClaim = SecurityUtils.GetPrimaryIdentityClaim(this.AuthorizationContext);
  97. }
  98. return this.identityClaim;
  99. }
  100. }
  101. public IIdentity PrimaryIdentity
  102. {
  103. get
  104. {
  105. if (this.primaryIdentity == null)
  106. {
  107. IIdentity primaryIdentity = null;
  108. IList<IIdentity> identities = GetIdentities();
  109. // Multiple Identities is treated as anonymous
  110. if (identities != null && identities.Count == 1)
  111. {
  112. primaryIdentity = identities[0];
  113. }
  114. this.primaryIdentity = primaryIdentity ?? SecurityUtils.AnonymousIdentity;
  115. }
  116. return this.primaryIdentity;
  117. }
  118. }
  119. public WindowsIdentity WindowsIdentity
  120. {
  121. get
  122. {
  123. if (this.windowsIdentity == null)
  124. {
  125. WindowsIdentity windowsIdentity = null;
  126. IList<IIdentity> identities = GetIdentities();
  127. if (identities != null)
  128. {
  129. for (int i = 0; i < identities.Count; ++i)
  130. {
  131. WindowsIdentity identity = identities[i] as WindowsIdentity;
  132. if (identity != null)
  133. {
  134. // Multiple Identities is treated as anonymous
  135. if (windowsIdentity != null)
  136. {
  137. windowsIdentity = WindowsIdentity.GetAnonymous();
  138. break;
  139. }
  140. windowsIdentity = identity;
  141. }
  142. }
  143. }
  144. this.windowsIdentity = windowsIdentity ?? WindowsIdentity.GetAnonymous();
  145. }
  146. return this.windowsIdentity;
  147. }
  148. }
  149. public ReadOnlyCollection<IAuthorizationPolicy> AuthorizationPolicies
  150. {
  151. get
  152. {
  153. return this.authorizationPolicies;
  154. }
  155. set
  156. {
  157. this.authorizationPolicies = value;
  158. }
  159. }
  160. public AuthorizationContext AuthorizationContext
  161. {
  162. get
  163. {
  164. if (this.authorizationContext == null)
  165. {
  166. this.authorizationContext = AuthorizationContext.CreateDefaultAuthorizationContext(this.authorizationPolicies);
  167. }
  168. return this.authorizationContext;
  169. }
  170. }
  171. IList<IIdentity> GetIdentities()
  172. {
  173. object identities;
  174. AuthorizationContext authContext = this.AuthorizationContext;
  175. if (authContext != null && authContext.Properties.TryGetValue(SecurityUtils.Identities, out identities))
  176. {
  177. return identities as IList<IIdentity>;
  178. }
  179. return null;
  180. }
  181. }
  182. }