ASP.Net使用System.Security.Principal模擬用戶
一、概述
在實際的項目開發(fā)中,我們可能會需要調(diào)用一些非托管程序,而有些非托管程序需要有更高的身份權(quán)限才能正確執(zhí)行。本文介紹了如何讓IIS承載的ASP.NET網(wǎng)站以特定的賬戶執(zhí)行,比如Administrator。
默認情況下禁用 ASP.NET 模擬。如果對某 ASP.NET 應(yīng)用程序啟用了模擬,該應(yīng)用程序?qū)⑦\行在標識上下文中,其訪問標記被 IIS 傳遞給 ASP.NET。
- 該標記可以是已通過身份驗證的用戶標記(如已登錄的 Windows 用戶的標記)【IIS上配置“集成Widows身份驗證”且不勾選“匿名訪問”的情況下】
- 該標記也可以是 IIS 為匿名用戶提供的標記(通常為 IUSR_MACHINENAME 標識)。 【IIS上配置勾選“匿名訪問”的情況下】

二、讀取被模擬用戶的標識
注意:可以使用以下代碼來確定線程作為哪個用戶執(zhí)行:
WindowsIdentity.GetCurrent().Name
三、模擬 IIS 驗證的帳戶或用戶
若要在收到 ASP.NET 應(yīng)用程序中每個頁的每個請求時模擬 Microsoft Internet 信息服務(wù) (IIS) 身份驗證用戶,必須在此應(yīng)用程序的 Web.config 文件中包含 <identity> 標記,并將 impersonate 屬性設(shè)置為 true。例如:
<identity impersonate="true" />
四、為 ASP.NET 應(yīng)用程序的所有請求模擬特定用戶
若要為 ASP.NET 應(yīng)用程序的所有頁面上的所有請求模擬特定用戶,可以在該應(yīng)用程序的 Web.config 文件的 <identity> 標記中指定 userName 和 password 屬性。例如:
<identity impersonate="true" userName="accountname" password="password" />
五、在代碼中模擬身份驗證用戶
若要僅在運行代碼的特定部分時模擬身份驗證用戶 (User.Identity),您可以使用以下代碼。此方法要求身份驗證用戶標識的類型為 WindowsIdentity。
WindowsImpersonationContext impersonationContext = ((WindowsIdentity)User.Identity).Impersonate(); //Insert your code that runs under the security context of the authenticating user here. impersonationContext.Undo();
六、在代碼中模擬特定用戶
若要僅在運行代碼的特定部分時模擬特定用戶,請使用以下代碼(使用Windows API):
<%@ Page Language="C#"%>
<%@ Import Namespace = "System.Web" %>
<%@ Import Namespace = "System.Web.Security" %>
<%@ Import Namespace = "System.Security.Principal" %>
<%@ Import Namespace = "System.Runtime.InteropServices" %>
<script runat=server>
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
public void Page_Load(Object s, EventArgs e)
{
if(impersonateValidUser("username", "domain", "password"))
{
//Insert your code that runs under the security context of a specific user here.
undoImpersonation();
}
else
{
//Your impersonation failed. Therefore, include a fail-safe mechanism here.
}
}
private bool impersonateValidUser(String userName, String domain, String password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if(RevertToSelf())
{
if(LogonUserA(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)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}
if(token!= IntPtr.Zero)
CloseHandle(token);
if(tokenDuplicate!=IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}
private void undoImpersonation()
{
impersonationContext.Undo();
}到此這篇關(guān)于ASP.Net使用System.Security.Principal模擬用戶的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.net 動態(tài)加載控件時一些問題的總結(jié)
經(jīng)常見到有人說在ASP.net中不要使用動態(tài)控件,我想主要的原因在于使用動態(tài)控件會帶來一些問題,在做項目的過程中,我將由動態(tài)加載控件引發(fā)的總是作了一個小小的總結(jié).2009-04-04
ASP.NET MVC4中使用Html.DropDownListFor的方法示例
這篇文章主要介紹了ASP.NET MVC4中使用Html.DropDownListFor的方法,結(jié)合實例形式分析了控制器數(shù)據(jù)源及Html.DropDownListFor顯示操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08
ASP.NET Gridview 中使用checkbox刪除的2種方法實例分享
ASP.NET Gridview 中使用checkbox刪除的2種方法實例分享,需要的朋友可以參考一下2013-06-06
ASP.NET實現(xiàn)將word文檔轉(zhuǎn)換成pdf的方法
這篇文章主要介紹了ASP.NET實現(xiàn)將word文檔轉(zhuǎn)換成pdf的方法,包含了兩種實現(xiàn)方法進行比對分析,非常具有實用價值,需要的朋友可以參考下2014-10-10
ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼
這篇文章主要介紹了ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼,需要的朋友可以參考下2017-10-10
ASP.NET Eval進行數(shù)據(jù)綁定的方法
ASP.NET Eval在數(shù)據(jù)綁定方面的應(yīng)用是眾所周知的,不過技術(shù)在發(fā)展,當ASP.NET Eval 1.1變成ASP.NET Eval 2.0的時候,在操作的時候會有什么變化呢?2013-04-04

