共用方式為


模擬和還原

備註

本文適用於 Windows。

如需 ASP.NET Core 的相關信息,請參閱 ASP.NET Core Security

有時候您可能需要取得 Windows 帳戶令牌來模擬 Windows 帳戶。 例如,您的 ASP.NET 為基礎的應用程式可能需要在不同時間代表多個使用者採取行動。 您的應用程式可能會接受代表 Internet Information Services (IIS) 系統管理員的令牌、模擬該使用者、執行作業,以及還原為先前的身分識別。 接下來,它可能會接受來自 IIS 的令牌,代表許可權較少的使用者、執行某些作業,然後再次還原。

如果您的應用程式必須模擬尚未由 IIS 附加至目前線程的 Windows 帳戶,您必須擷取該帳戶的令牌,並使用它來啟動帳戶。 您可以執行下列工作來執行此動作:

  1. 透過呼叫 Unmanaged LogonUser 方法,擷取特定使用者的帳戶令牌。 這個方法不在 .NET 基類連結庫中,而是位於 unmanaged advapi32.dll。 在 Unmanaged 程式代碼中存取方法是進階作業,而且超出此討論的範圍。 如需詳細資訊,請參閱與非受控程式碼互通。 如需 LogonUser 方法和 advapi32.dll的詳細資訊,請參閱 Platform SDK 檔。

  2. 建立 WindowsIdentity 類別的新實例,並傳遞令牌。 下列程式代碼示範此呼叫,其中 hToken 代表 Windows 令牌。

    WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);  
    
    Dim impersonatedIdentity As New WindowsIdentity(hToken)  
    
  3. 開始模擬時,透過建立 WindowsImpersonationContext 類別的新實例,並使用初始化過的類別的 WindowsIdentity.Impersonate 方法來進行初始化,如下列程式碼所示。

    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();  
    
    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate()  
    
  4. 當您不再需要模擬時,請呼叫 WindowsImpersonationContext.Undo 方法來還原模擬,如下列程式代碼所示。

    myImpersonation.Undo();  
    
    myImpersonation.Undo()  
    

如果信任的代碼已經將 WindowsPrincipal 物件附加到線程上,您可以呼叫實例方法 Impersonate,而這個方法不需要使用帳戶令牌。 請注意,只有在線程上的 WindowsPrincipal 物件代表目前執行進程的使用者以外的使用者時,這個方法才有用。 例如,使用 ASP.NET 時,如果開啟了 Windows 驗證並關閉了模擬,您可能會遇到這種情況。 在此情況下,進程是在 Internet Information Services (IIS) 中設定的帳戶下執行,而目前的主體則代表正在存取頁面的 Windows 使用者。

請注意, 模擬復原 都不會變更與目前呼叫內容相關聯的 Principal 物件 (IPrincipal)。 相反地,模擬和還原會變更與目前作系統進程相關聯的令牌。

另請參閱