You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			125 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| //     Copyright (c) Microsoft Corporation.  All rights reserved.
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| using System.Collections.Generic;
 | |
| using System.Collections.ObjectModel;
 | |
| using System.IdentityModel.Diagnostics.Application;
 | |
| using System.Runtime;
 | |
| using System.Runtime.Diagnostics;
 | |
| using System.Security.Claims;
 | |
| using System.Security.Principal;
 | |
| using System.Xml;
 | |
| 
 | |
| namespace System.IdentityModel.Tokens
 | |
| {
 | |
|     /// <summary>
 | |
|     /// SecurityTokenHandler for KerberosReceiverSecurityToken.
 | |
|     /// </summary>
 | |
|     public class KerberosSecurityTokenHandler : SecurityTokenHandler
 | |
|     {
 | |
|         static string[] _tokenTypeIdentifiers = new string[] { SecurityTokenTypes.Kerberos };
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Creates an instance of <see cref="KerberosSecurityTokenHandler"/>
 | |
|         /// </summary>
 | |
|         public KerberosSecurityTokenHandler()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the settings that indicate if the handler can validate tokens.
 | |
|         /// Returns true by default.
 | |
|         /// </summary>
 | |
|         public override bool CanValidateToken
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the System.Type of the token that this SecurityTokenHandler handles.
 | |
|         /// Returns type of <see cref="KerberosReceiverSecurityToken"/> by default.
 | |
|         /// </summary>
 | |
|         public override Type TokenType
 | |
|         {
 | |
|             get { return typeof(KerberosReceiverSecurityToken); }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the Kerberos Security token type defined in WS-Security Kerberos
 | |
|         /// Security Token profile.
 | |
|         /// </summary>
 | |
|         public override string[] GetTokenTypeIdentifiers()
 | |
|         {
 | |
|             return _tokenTypeIdentifiers;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Validates a <see cref="KerberosReceiverSecurityToken"/>.
 | |
|         /// </summary>
 | |
|         /// <param name="token">The <see cref="KerberosReceiverSecurityToken"/> to validate.</param>
 | |
|         /// <returns>A <see cref="ReadOnlyCollection{T}"/> of <see cref="ClaimsIdentity"/> representing the identities contained in the token.</returns>
 | |
|         /// <exception cref="ArgumentNullException">The parameter 'token' is null.</exception>
 | |
|         /// <exception cref="ArgumentException">The token is not assignable from <see cref="KerberosReceiverSecurityToken"/>.</exception>
 | |
|         /// <exception cref="InvalidOperationException">Configuration <see cref="SecurityTokenHandlerConfiguration"/>is null.</exception>                
 | |
|         /// <exception cref="InvalidOperationException">The <see cref="WindowsIdentity"/> of the <see cref="KerberosReceiverSecurityToken"/>is null.</exception>                
 | |
|         public override ReadOnlyCollection<ClaimsIdentity> ValidateToken(SecurityToken token)
 | |
|         {
 | |
|             if (token == null)
 | |
|             {
 | |
|                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
 | |
|             }
 | |
| 
 | |
|             KerberosReceiverSecurityToken kerbToken = token as KerberosReceiverSecurityToken;
 | |
|             if (kerbToken == null)
 | |
|             {
 | |
|                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("token", SR.GetString(SR.ID0018, typeof(KerberosReceiverSecurityToken)));
 | |
|             }
 | |
| 
 | |
|             if (this.Configuration == null)
 | |
|             {
 | |
|                 throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID4274));
 | |
|             }
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 if (kerbToken.WindowsIdentity == null)
 | |
|                 {
 | |
|                     throw DiagnosticUtility.ThrowHelperInvalidOperation(SR.GetString(SR.ID4026));
 | |
|                 }
 | |
| 
 | |
|                 // KerberosReceiveSecurityToken is disposable, best to make a copy as Dispose() nulls out the WindowsIdentity. The AuthenticationType was set when the kerbToken was created.
 | |
|                 WindowsIdentity wi = new WindowsIdentity(kerbToken.WindowsIdentity.Token, kerbToken.WindowsIdentity.AuthenticationType);
 | |
| 
 | |
|                 // PARTIAL TRUST: will fail when adding claims, AddClaim is SecurityCritical.
 | |
|                 wi.AddClaim(new Claim(ClaimTypes.AuthenticationInstant, XmlConvert.ToString(DateTime.UtcNow, DateTimeFormats.Generated), ClaimValueTypes.DateTime));
 | |
|                 wi.AddClaim(new Claim(ClaimTypes.AuthenticationMethod, AuthenticationMethods.Windows, ClaimValueTypes.String));
 | |
| 
 | |
|                 if (this.Configuration.SaveBootstrapContext)
 | |
|                 {
 | |
|                     wi.BootstrapContext = new BootstrapContext(token, this);
 | |
|                 }
 | |
| 
 | |
|                 this.TraceTokenValidationSuccess(token);
 | |
| 
 | |
|                 List<ClaimsIdentity> identities = new List<ClaimsIdentity>(1);
 | |
|                 identities.Add(wi);
 | |
|                 return identities.AsReadOnly();
 | |
|             }
 | |
|             catch (Exception e)
 | |
|             {
 | |
|                 if (Fx.IsFatal(e))
 | |
|                 {
 | |
|                     throw;
 | |
|                 }
 | |
| 
 | |
|                 this.TraceTokenValidationFailure(token, e.Message);
 | |
|                 throw e;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |