SpnegoTokenAuthenticator.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Security / SpnegoTokenAuthenticator.cs / 1 / SpnegoTokenAuthenticator.cs

                            //------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
 
namespace System.ServiceModel.Security
{ 
    using System; 
    using System.ServiceModel;
    using System.Collections; 
    using System.Xml;
    using System.Net;
    using System.Security.Principal;
    using System.Collections.Generic; 
    using System.Collections.ObjectModel;
    using System.IdentityModel.Claims; 
    using System.IdentityModel.Policy; 
    using System.IdentityModel.Tokens;
    using System.ServiceModel.Security.Tokens; 
    using System.Runtime.Serialization;
    using System.ServiceModel.Diagnostics;

    using SafeCloseHandle = System.IdentityModel.SafeCloseHandle; 
    using SafeFreeCredentials = System.IdentityModel.SafeFreeCredentials;
 
    sealed class SpnegoTokenAuthenticator : SspiNegotiationTokenAuthenticator 
    {
        bool extractGroupsForWindowsAccounts; 
        NetworkCredential serverCredential;
        bool allowUnauthenticatedCallers;
        SafeFreeCredentials credentialsHandle;
 
        public SpnegoTokenAuthenticator()
            : base() 
        { 
            // empty
        } 

        // settings
        public bool ExtractGroupsForWindowsAccounts
        { 
            get
            { 
                return this.extractGroupsForWindowsAccounts; 
            }
            set 
            {
                this.CommunicationObject.ThrowIfDisposedOrImmutable();
                this.extractGroupsForWindowsAccounts = value;
            } 
        }
 
        public NetworkCredential ServerCredential 
        {
            get 
            {
                return this.serverCredential;
            }
            set 
            {
                this.CommunicationObject.ThrowIfDisposedOrImmutable(); 
                this.serverCredential = value; 
            }
        } 

        public bool AllowUnauthenticatedCallers
        {
            get 
            {
                return this.allowUnauthenticatedCallers; 
            } 
            set
            { 
                this.CommunicationObject.ThrowIfDisposedOrImmutable();
                this.allowUnauthenticatedCallers = value;
            }
        } 

        // overrides 
        public override XmlDictionaryString NegotiationValueType 
        {
            get 
            {
                return XD.TrustApr2004Dictionary.SpnegoValueTypeUri;
            }
        } 

        public override void OnOpening() 
        { 
            base.OnOpening();
            if (this.credentialsHandle == null) 
            {
                this.credentialsHandle = SecurityUtils.GetCredentialsHandle("Negotiate", this.serverCredential, true);
            }
        } 

        public override void OnClose(TimeSpan timeout) 
        { 
            base.OnClose(timeout);
            FreeCredentialsHandle(); 
        }

        public override void OnAbort()
        { 
            base.OnAbort();
            FreeCredentialsHandle(); 
        } 

        void FreeCredentialsHandle() 
        {
            if (this.credentialsHandle != null)
            {
                this.credentialsHandle.Close(); 
                this.credentialsHandle = null;
            } 
        } 

        protected override SspiNegotiationTokenAuthenticatorState CreateSspiState(byte[] incomingBlob, string incomingValueTypeUri) 
        {
            ISspiNegotiation windowsNegotiation = new WindowsSspiNegotiation("Negotiate", this.credentialsHandle);
            return new SspiNegotiationTokenAuthenticatorState(windowsNegotiation);
        } 

        protected override ReadOnlyCollection ValidateSspiNegotiation(ISspiNegotiation sspiNegotiation) 
        { 
            WindowsSspiNegotiation windowsNegotiation = (WindowsSspiNegotiation)sspiNegotiation;
            if (windowsNegotiation.IsValidContext == false) 
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.InvalidSspiNegotiation)));
            }
            SecurityTraceRecordHelper.TraceServiceSpnego(windowsNegotiation); 
            if (this.IsClientAnonymous)
            { 
                return EmptyReadOnlyCollection.Instance; 
            }
            using (SafeCloseHandle contextToken = windowsNegotiation.GetContextToken()) 
            {
                WindowsIdentity windowsIdentity = new WindowsIdentity(contextToken.DangerousGetHandle());
                SecurityUtils.ValidateAnonymityConstraint(windowsIdentity, this.AllowUnauthenticatedCallers);
 
                List policies = new List(1);
                WindowsClaimSet wic = new WindowsClaimSet(windowsIdentity, this.extractGroupsForWindowsAccounts, false); 
                policies.Add(new System.IdentityModel.Policy.UnconditionalPolicy(wic, TimeoutHelper.Add(DateTime.UtcNow, base.ServiceTokenLifetime))); 
                return policies.AsReadOnly();
            } 
        }
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK