預設情況下,ASP.NET應用程式以本機的ASPNET帳號運行,該帳號屬於普通用戶組,許可權受到一定的限制,以保障ASP.NET應用程式運行的安全。但是有時需要某個ASP.NET應用程式或者程式中的某段代碼執行需要特定許可權的操作,比如某個文件的存取,這時就需要給該程式或相應的某段代碼賦予某個帳號的許可權 ...
預設情況下,ASP.NET應用程式以本機的ASPNET帳號運行,該帳號屬於普通用戶組,許可權受到一定的限制,以保障ASP.NET應用程式運行的安全。但是有時需要某個ASP.NET應用程式或者程式中的某段代碼執行需要特定許可權的操作,比如某個文件的存取,這時就需要給該程式或相應的某段代碼賦予某個帳號的許可權以執行該操作,這種方法稱之為身份模擬(Impersonation)。
也就是說如果當前IIS的用戶在Windows系統中進行某些操作時許可權不足,除了可以對IIS用戶設置更高的許可權外,還可以進行身份模擬,使當前IIS用戶具有某個用戶的許可權。預設情況下模擬的帳戶是 IIS APPPOOL\DefaultAppPool,當然可以進行額外的設置。
通過配置文件
<identity impersonate="true" />
若指定模擬某個用戶,則設置userName和password的屬性值
<identity impersonate="true" password="" userName="" />
另外也可以通過IIS進行設置
身份驗證進去
設置特定的賬戶
在代碼中開啟
在代碼中使用身份模擬更加靈活,可以在指定的代碼段中使用身份模擬,在該代碼段之外恢復使用ASPNET本機帳號。該方法要求必須使用Windows的認證身份標識。
System.Security.Principal.WindowsImpersonationContext impersonationContext; impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate(); //Insert your code that runs under the security context of the authenticating user here. impersonationContext.Undo();
上例中,需要使用Windows身份驗證,否則User.Identity不是WindowsIdentity,強制轉換會失敗然後報錯
模擬指定賬戶
public const int LOGON32_LOGON_INTERACTIVE = 2; public const int LOGON32_PROVIDER_DEFAULT = 0; WindowsImpersonationContext impersonationContext; [DllImport("advapi32.dll", CharSet=CharSet.Auto)] public static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)] public extern static int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
WindowsIdentity tempWindowsIdentity; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; if(LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) { if(DuplicateToken(token, 2, ref tokenDuplicate) != 0) { tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); impersonationContext = tempWindowsIdentity.Impersonate(); if (impersonationContext != null) return true; else return false; } else return false; }
以上代碼試過了,鄙人嘗試對某個文件設置許可權,當前的windows用戶可以讀寫,不知為何模擬管理員身份時則不可讀寫。體現在未開始模擬時System.IO.File.Exists返回true,而開了模擬之後就false。