identity與ASP.NET 模擬

默認狀況下,ASP.NET應用程序以本機的ASPNET賬號運行,該賬號屬於普通用戶組,權限受到必定的限制,以保障ASP.NET應用程序運行的安全。可是有時須要某個ASP.NET應用程序或者程序中的某段代碼執行須要特定權限的操做,好比某個文件的存取,這時就須要給該程序或相應的某段代碼賦予某個賬號的權限以執行該操做,這種方法稱之爲身份模擬(Impersonation)。 windows

也就是說若是當前IIS的用戶在Windows系統中進行某些操做時權限不足,除了能夠對IIS用戶設置更高的權限外,還能夠進行身份模擬,使當前IIS用戶具備某個用戶的權限。默認狀況下模擬的賬戶是 IIS APPPOOL\DefaultAppPool,固然能夠進行額外的設置。api

經過配置文件 安全

<identity impersonate="true" />

若指定模擬某個用戶,則設置userName和password的屬性值dom

<identity impersonate="true" password="" userName="" />

另外也能夠經過IIS進行設置ide

身份驗證進去 spa

設置特定的帳戶 code

   

在代碼中開啓 blog

在代碼中使用身份模擬更加靈活,能夠在指定的代碼段中使用身份模擬,在該代碼段以外恢復使用ASPNET本機賬號。該方法要求必須使用Windows的認證身份標識。 token

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,強制轉換會失敗而後報錯ip

   

模擬指定帳戶

 

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。

相關文章
相關標籤/搜索