ASP.NET:以域用户身份访问网络资源

2020-12-13 01:22

阅读:450

标签:class   code   ext   get   int   string   

using System;
using System.IO;
using System.Security.Principal;
using System.ComponentModel;
using System.Configuration;
using System.Runtime.InteropServices;

namespace AD.Data
{
    public delegate void FileOSExecution(params object[] Data);

    public static class FileOS
    {

        private static readonly String FileUploadUser = "User";
        private static readonly String FileUploadPassword = "password";
        private static readonly String FileUploadUserDomain = "domain";

        public static void Execute(FileOSExecution fileOSExecution, out Exception Error, params object[] Data)
        {
            Error = null;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;
            try
            {
                if (!NativeMethods.LogonUser(
                    FileUploadUser,
                    FileUploadUserDomain,
                    FileUploadPassword,
                    NativeMethods.LogonType.NewCredentials,
                    NativeMethods.LogonProvider.Default,
                    out token))
                {
                    Error = new Win32Exception("User Logon Error");
                    return;
                }
                if (!NativeMethods.DuplicateToken(
                    token,
                    NativeMethods.SecurityImpersonationLevel.Impersonation,
                    out tokenDuplicate))
                {
                    Error = new Win32Exception("Duplicate Token Error");
                    return;
                }
                using (WindowsImpersonationContext impersonationContext =
                    new WindowsIdentity(tokenDuplicate).Impersonate())
                {
                    try
                    {
                        fileOSExecution(Data);
                    }
                    catch (Exception e)
                    {
                        Error = e;
                    }
                    impersonationContext.Undo();
                }
            }
            finally
            {
                if (tokenDuplicate != IntPtr.Zero)
                    NativeMethods.CloseHandle(tokenDuplicate);
                if (token != IntPtr.Zero)
                    NativeMethods.CloseHandle(token);
            }
        }

    }

    ///


    /// Implements P/Invoke Interop calls to the operating system.
    ///

    internal static class NativeMethods
    {
        ///
        /// The type of logon operation to perform.
        ///

        internal enum LogonType : int
        {
            ///
            /// This logon type is intended for users who will be interactively
            /// using the computer, such as a user being logged on by a
            /// terminal server, remote shell, or similar process.
            /// This logon type has the additional expense of caching logon
            /// information for disconnected operations; therefore, it is
            /// inappropriate for some client/server applications, such as a
            /// mail server.
            ///

            Interactive = 2,

            ///


            /// This logon type is intended for high performance servers to
            /// authenticate plaintext passwords.
            /// The LogonUser function does not cache credentials for this
            /// logon type.
            ///

            Network = 3,

            ///


            /// This logon type is intended for batch servers, where processes
            /// may be executing on behalf of a user without their direct
            /// intervention.  This type is also for higher performance servers
            /// that process many plaintext authentication attempts at a time,
            /// such as mail or Web servers.
            /// The LogonUser function does not cache credentials for this
            /// logon type.
            ///

            Batch = 4,

            ///


            /// Indicates a service-type logon.  The account provided must have
            /// the service privilege enabled.
            ///

            Service = 5,

            ///


            /// This logon type is for GINA DLLs that log on users who will be
            /// interactively using the computer.
            /// This logon type can generate a unique audit record that shows
            /// when the workstation was unlocked.
            ///

            Unlock = 7,

            ///


            /// This logon type preserves the name and password in the
            /// authentication package, which allows the server to make
            /// connections to other network servers while impersonating the
            /// client.  A server can accept plaintext credentials from a
            /// client, call LogonUser, verify that the user can access the
            /// system across the network, and still communicate with other
            /// servers.
            /// NOTE: Windows NT:  This value is not supported.
            ///

            NetworkCleartext = 8,

            ///


            /// This logon type allows the caller to clone its current token
            /// and specify new credentials for outbound connections.  The new
            /// logon session has the same local identifier but uses different
            /// credentials for other network connections.
            /// NOTE: This logon type is supported only by the
            /// LOGON32_PROVIDER_WINNT50 logon provider.
            /// NOTE: Windows NT:  This value is not supported.
            ///

            NewCredentials = 9
        }

        ///


        /// Specifies the logon provider.
        ///

        internal enum LogonProvider : int
        {
            ///
            /// Use the standard logon provider for the system.
            /// The default security provider is negotiate, unless you pass
            /// NULL for the domain name and the user name is not in UPN format.
            /// In this case, the default provider is NTLM.
            /// NOTE: Windows 2000/NT:   The default security provider is NTLM.
            ///

            Default = 0,

            ///


            /// Use this provider if you‘ll be authenticating against a Windows
            /// NT 3.51 domain controller (uses the NT 3.51 logon provider).
            ///

            WinNT35 = 1,

            ///


            /// Use the NTLM logon provider.
            ///

            WinNT40 = 2,

            ///


            /// Use the negotiate logon provider.
            ///

            WinNT50 = 3
        }

        ///


        /// The type of logon operation to perform.
        ///

        internal enum SecurityImpersonationLevel : int
        {
            ///
            /// The server process cannot obtain identification information
            /// about the client, and it cannot impersonate the client.  It is
            /// defined with no value given, and thus, by ANSI C rules,
            /// defaults to a value of zero.
            ///

            Anonymous = 0,

            ///


            /// The server process can obtain information about the client,
            /// such as security identifiers and privileges, but it cannot
            /// impersonate the client.  This is useful for servers that export
            /// their own objects, for example, database products that export
            /// tables and views.  Using the retrieved client-security
            /// information, the server can make access-validation decisions
            /// without being able to use other services that are using the
            /// client‘s security context.
            ///

            Identification = 1,

            ///


            /// The server process can impersonate the client‘s security
            /// context on its local system.  The server cannot impersonate the
            /// client on remote systems.
            ///

            Impersonation = 2,

            ///


            /// The server process can impersonate the client‘s security
            /// context on remote systems.
            /// NOTE: Windows NT:  This impersonation level is not supported.
            ///

            Delegation = 3
        }

        ///


        /// Logs on the user.
        ///

        /// Name of the user.
        /// The domain.
        /// The password.
        /// Type of the logon.
        /// The logon provider.
        /// The token.
        /// True if the function succeeds, false if the function fails.
        /// To get extended error information, call GetLastError.

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool LogonUser(
            string userName,
            string domain,
            string password,
            LogonType logonType,
            LogonProvider logonProvider,
            out IntPtr token);

        ///


        /// Duplicates the token.
        ///

        /// The existing token
        /// handle.
        /// The security impersonation
        /// level.
        /// The duplicate token
        /// handle.
        /// True if the function succeeds, false if the function fails.
        /// To get extended error information, call GetLastError.

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool DuplicateToken(
            IntPtr existingTokenHandle,
            SecurityImpersonationLevel securityImpersonationLevel,
            out IntPtr duplicateTokenHandle);

        ///


        /// Closes the handle.
        ///

        /// The handle.
        /// True if the function succeeds, false if the function fails.
        /// To get extended error information, call GetLastError.

        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool CloseHandle(IntPtr handle);
    }

}

ASP.NET:以域用户身份访问网络资源,搜素材,soscw.com

ASP.NET:以域用户身份访问网络资源

标签:class   code   ext   get   int   string   

原文地址:http://www.cnblogs.com/sungang3225/p/3704764.html


评论


亲,登录后才可以留言!