ASP.Net使用System.Security.Principal模擬用戶
一、概述
在實(shí)際的項(xiàng)目開發(fā)中,我們可能會(huì)需要調(diào)用一些非托管程序,而有些非托管程序需要有更高的身份權(quán)限才能正確執(zhí)行。本文介紹了如何讓IIS承載的ASP.NET網(wǎng)站以特定的賬戶執(zhí)行,比如Administrator。
默認(rèn)情況下禁用 ASP.NET 模擬。如果對(duì)某 ASP.NET 應(yīng)用程序啟用了模擬,該應(yīng)用程序?qū)⑦\(yùn)行在標(biāo)識(shí)上下文中,其訪問標(biāo)記被 IIS 傳遞給 ASP.NET。
- 該標(biāo)記可以是已通過身份驗(yàn)證的用戶標(biāo)記(如已登錄的 Windows 用戶的標(biāo)記)【IIS上配置“集成Widows身份驗(yàn)證”且不勾選“匿名訪問”的情況下】
- 該標(biāo)記也可以是 IIS 為匿名用戶提供的標(biāo)記(通常為 IUSR_MACHINENAME 標(biāo)識(shí))。 【IIS上配置勾選“匿名訪問”的情況下】
二、讀取被模擬用戶的標(biāo)識(shí)
注意:可以使用以下代碼來確定線程作為哪個(gè)用戶執(zhí)行:
WindowsIdentity.GetCurrent().Name
三、模擬 IIS 驗(yàn)證的帳戶或用戶
若要在收到 ASP.NET 應(yīng)用程序中每個(gè)頁的每個(gè)請求時(shí)模擬 Microsoft Internet 信息服務(wù) (IIS) 身份驗(yàn)證用戶,必須在此應(yīng)用程序的 Web.config 文件中包含 <identity> 標(biāo)記,并將 impersonate 屬性設(shè)置為 true。例如:
<identity impersonate="true" />
四、為 ASP.NET 應(yīng)用程序的所有請求模擬特定用戶
若要為 ASP.NET 應(yīng)用程序的所有頁面上的所有請求模擬特定用戶,可以在該應(yīng)用程序的 Web.config 文件的 <identity> 標(biāo)記中指定 userName 和 password 屬性。例如:
<identity impersonate="true" userName="accountname" password="password" />
五、在代碼中模擬身份驗(yàn)證用戶
若要僅在運(yùn)行代碼的特定部分時(shí)模擬身份驗(yàn)證用戶 (User.Identity),您可以使用以下代碼。此方法要求身份驗(yàn)證用戶標(biāo)識(shí)的類型為 WindowsIdentity。
WindowsImpersonationContext impersonationContext = ((WindowsIdentity)User.Identity).Impersonate(); //Insert your code that runs under the security context of the authenticating user here. impersonationContext.Undo();
六、在代碼中模擬特定用戶
若要僅在運(yùn)行代碼的特定部分時(shí)模擬特定用戶,請使用以下代碼(使用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模擬用戶的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net“服務(wù)器應(yīng)用程序不可用” 解決方法
服務(wù)器應(yīng)用程序不可用 您試圖在此 Web 服務(wù)器上訪問的 Web 應(yīng)用程序當(dāng)前不可用。請點(diǎn)擊 Web 瀏覽器中的“刷新”按鈕重試您的請求。 管理員注意事項(xiàng): 詳述此特定請求失敗原因的錯(cuò)誤消息可在 Web 服務(wù)器的系統(tǒng)事件日志中找到。請檢查此日志項(xiàng)以查明導(dǎo)致該錯(cuò)誤發(fā)生的原因。2008-10-10IIS處理Asp.net請求和Asp.net頁面生命周期說明
當(dāng)一個(gè)客戶端頁面訪問IIS試圖獲取一些信息的時(shí)候,發(fā)生了什么事情?一個(gè)請求在通過了HTTP管道后又發(fā)生了什么?本文主要是描述這兩個(gè)過程,即IIS處理asp.net請求和asp.net的頁面生命周期。歡迎大家積極拍磚,共同學(xué)習(xí),共同進(jìn)步。2011-05-05.net實(shí)現(xiàn)微信公眾賬號(hào)接口開發(fā)實(shí)例代碼
這篇文章主要介紹了.net實(shí)現(xiàn)微信公眾賬號(hào)接口開發(fā)實(shí)例代碼,有需要的朋友可以參考一下2013-12-12asp.net中js+jquery添加下拉框值和后臺(tái)獲取示例
這篇文章主要介紹了asp.net中js+jquery添加下拉框值和后臺(tái)獲取的具體實(shí)現(xiàn),需要的朋友可以參考下2014-05-05IdnentiyServer使用客戶端憑據(jù)訪問API的實(shí)例代碼
這篇文章主要介紹了IdnentiyServer-使用客戶端憑據(jù)訪問API的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-10-10C#實(shí)現(xiàn)EXCEL數(shù)據(jù)到TXT文檔的轉(zhuǎn)換
C#實(shí)現(xiàn)EXCEL數(shù)據(jù)到TXT文檔的轉(zhuǎn)換,需要的朋友可以參考一下2013-02-02