日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

ASP.Net使用System.Security.Principal模擬用戶(hù)_實(shí)用技巧

作者:springsnow ? 更新時(shí)間: 2022-07-07 編程語(yǔ)言

一、概述

在實(shí)際的項(xiàng)目開(kāi)發(fā)中,我們可能會(huì)需要調(diào)用一些非托管程序,而有些非托管程序需要有更高的身份權(quán)限才能正確執(zhí)行。本文介紹了如何讓IIS承載的ASP.NET網(wǎng)站以特定的賬戶(hù)執(zhí)行,比如Administrator。

默認(rèn)情況下禁用 ASP.NET 模擬。如果對(duì)某 ASP.NET 應(yīng)用程序啟用了模擬,該應(yīng)用程序?qū)⑦\(yùn)行在標(biāo)識(shí)上下文中,其訪(fǎng)問(wèn)標(biāo)記被 IIS 傳遞給 ASP.NET。

  • 該標(biāo)記可以是已通過(guò)身份驗(yàn)證的用戶(hù)標(biāo)記(如已登錄的 Windows 用戶(hù)的標(biāo)記)【IIS上配置“集成Widows身份驗(yàn)證”且不勾選“匿名訪(fǎng)問(wèn)”的情況下】
  • 該標(biāo)記也可以是 IIS 為匿名用戶(hù)提供的標(biāo)記(通常為 IUSR_MACHINENAME 標(biāo)識(shí))。 【IIS上配置勾選“匿名訪(fǎng)問(wèn)”的情況下】

二、讀取被模擬用戶(hù)的標(biāo)識(shí)

注意:可以使用以下代碼來(lái)確定線(xiàn)程作為哪個(gè)用戶(hù)執(zhí)行:

WindowsIdentity.GetCurrent().Name

三、模擬 IIS 驗(yàn)證的帳戶(hù)或用戶(hù)

若要在收到 ASP.NET 應(yīng)用程序中每個(gè)頁(yè)的每個(gè)請(qǐng)求時(shí)模擬 Microsoft Internet 信息服務(wù) (IIS) 身份驗(yàn)證用戶(hù),必須在此應(yīng)用程序的 Web.config 文件中包含?<identity>?標(biāo)記,并將?impersonate?屬性設(shè)置為?true。例如:

<identity impersonate="true" />

四、為 ASP.NET 應(yīng)用程序的所有請(qǐng)求模擬特定用戶(hù)

若要為 ASP.NET 應(yīng)用程序的所有頁(yè)面上的所有請(qǐng)求模擬特定用戶(hù),可以在該應(yīng)用程序的 Web.config 文件的?<identity>?標(biāo)記中指定?userName?和?password?屬性。例如:

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

五、在代碼中模擬身份驗(yàn)證用戶(hù)

若要僅在運(yùn)行代碼的特定部分時(shí)模擬身份驗(yàn)證用戶(hù) (User.Identity),您可以使用以下代碼。此方法要求身份驗(yàn)證用戶(hù)標(biāo)識(shí)的類(lèi)型為?WindowsIdentity

WindowsImpersonationContext impersonationContext =  ((WindowsIdentity)User.Identity).Impersonate();

//Insert your code that runs under the security context of the authenticating user here.

impersonationContext.Undo();

六、在代碼中模擬特定用戶(hù)

若要僅在運(yùn)行代碼的特定部分時(shí)模擬特定用戶(hù),請(qǐng)使用以下代碼(使用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();
}

原文鏈接:https://www.cnblogs.com/springsnow/p/9433965.html

欄目分類(lèi)
最近更新