SystemIdentity.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 / infocard / Service / managed / Microsoft / InfoCards / SystemIdentity.cs / 1 / SystemIdentity.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.InfoCards
{ 
    using System;
    using System.ComponentModel; 
    using System.Globalization; 
    using System.Runtime.InteropServices;
    using System.Security.Principal; 

    using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;

    internal sealed class SystemIdentity : IDisposable 
    {
        bool m_isDisposed; 
        WindowsIdentity m_identity; 
        object m_sync;
 
        public static readonly IdentityReference LsaIdentityReference = new SecurityIdentifier( "SY" );

        public SystemIdentity( bool throwIfAlreadySystem )
        { 
            m_sync = new object();
 
            WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
            if( identity.IsSystem && throwIfAlreadySystem )
            { 
                //
                // This is an internal fatal error.
                //
                throw IDT.ThrowHelperError( 
                                    new InvalidOperationException(
                                        SR.GetString( SR.UserIdentityEqualSystemNotSupported ) ) ); 
            } 
            else if( !identity.IsSystem )
            { 
                m_identity = identity;
#pragma warning suppress 56523
                if( !NativeMethods.RevertToSelf() )
                { 
                    IDT.Assert( false, "Identity management failure" );
                } 
            } 
            else
            { 
                //
                // Do nothing.  we are LSA already and throwIfAlreadySystem == false
                //
                IDT.Assert( null == m_identity, "m_identity should be null when we are system and throwIfAlreadySystem == false"  ); 
            }
        } 
 

        void IDisposable.Dispose() 
        {
            if ( m_isDisposed )
            {
                return; 
            }
 
            lock( m_sync ) 
            {
                if( m_isDisposed ) 
                {
                    return;
                }
 
                m_isDisposed = true;
 
                if( null != m_identity ) 
                {
                    // 
                    // Impersonate the user
                    //
                    if( !NativeMethods.ImpersonateLoggedOnUser( m_identity.Token ) )
                    { 
                        int hr = Marshal.GetHRForLastWin32Error();
                        // 
                        // This exception is fatal to our service. 
                        //  it could corrupt the flow of identity that the service expects.
                        // Failfast here. 
                        //

                        Diagnostics.InfoCardTrace.FailFast( String.Format( CultureInfo.InvariantCulture,
                                                                           SR.GetString( SR.StoreImpersonateLoggedOnUserFailed ), 
                                                                           hr ) );
                    } 
 
                    m_identity.Dispose();
                } 


            }
        } 
    }
} 

// 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