共用方式為


模擬用戶端

模擬範例會示範如何在服務端模擬呼叫者應用程式,以便讓服務能夠代表該呼叫者存取系統資源。

此範例是以自我裝載範例為基礎。 服務和用戶端的組態檔與自我裝載範例的組態檔相同。

注意

此範例的安裝程序與建置指示位於本主題的結尾。

此段服務程式碼已經過修改,使得服務的 Add 方法會使用 OperationBehaviorAttribute 模擬呼叫者,如下列範例程式碼所示。

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public double Add(double n1, double n2)
{
    double result = n1 + n2;
    Console.WriteLine("Received Add({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    DisplayIdentityInformation();
    return result;
}

因此,執行執行緒的安全性內容會在進入 Add 方法前切換成模擬呼叫者,然後在此方法結束時還原。

顯示於下列範例程式碼中的 DisplayIdentityInformation 方法,就是會顯示呼叫者身分識別的公用程式函式。

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tThread Identity            :{0}",
         WindowsIdentity.GetCurrent().Name);
    Console.WriteLine("\t\tThread Identity level  :{0}",
         WindowsIdentity.GetCurrent().ImpersonationLevel);
    Console.WriteLine("\t\thToken                     :{0}",
         WindowsIdentity.GetCurrent().Token.ToString());
    return;
}

此服務的 Subtract 方法會使用命令式呼叫來模擬呼叫者,如下列範例程式碼所示。

public double Subtract(double n1, double n2)
{
    double result = n1 - n2;
    Console.WriteLine("Received Subtract({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    Console.WriteLine("Before impersonating");
    DisplayIdentityInformation();

    if (ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Impersonation ||
        ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Delegation)
    {
        // Impersonate.
        using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
        {
            // Make a system call in the caller's context and ACLs
            // on the system resource are enforced in the caller's context.
            Console.WriteLine("Impersonating the caller imperatively");
            DisplayIdentityInformation();
        }
    }
    else
    {
        Console.WriteLine("ImpersonationLevel is not high enough to perform this operation.");
    }

    Console.WriteLine("After reverting");
    DisplayIdentityInformation();
    return result;
}

請注意,在這個範例中,並非整個呼叫期間都在模擬呼叫者,而只有在某些階段模擬。 一般來說,將模擬侷限在最小範圍比在整個作業都模擬來得好。

其他方法不會模擬呼叫者。

用戶端程式碼已修改成將模擬層級設定為 Impersonation。 用戶端會使用 TokenImpersonationLevel 列舉,指定服務要使用的模擬層級。 該列舉支援下列值:NoneAnonymousIdentificationImpersonationDelegation。 如果要在存取以 Windows ACL 保護之本機電腦上的系統資源時執行存取檢查,此模擬層級必須設定為 Impersonation,如下列範例程式碼所示。

// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

當您執行範例時,作業要求和回應會顯示在服務與用戶端主控台視窗中。 在每個主控台視窗中按下 ENTER 鍵,即可關閉服務與用戶端。

注意

此服務必須使用系統管理帳戶執行,或是用來執行此服務的帳戶必須獲得可向 HTTP 層註冊 http://localhost:8000/ServiceModelSamples URI 的權限。 使用 Httpcfg.exe 工具 (本頁面可能為英文) 設定命名空間保留 (本頁面可能為英文),便可授與這類權限。

注意

在執行 Windows Server 2003 的電腦上,只有在 Host.exe 應用程式擁有「模擬」權限的情況下才支援模擬。 (根據預設,只有系統管理員具有此權限)。若要將這個權限新增至執行此服務的帳戶,請移至 [系統管理工具],依序開啟 [本機安全性原則]、[本機原則],接著按一下 [使用者權限指派],然後選取 [在驗證後模擬用戶端],再按兩下 [內容] 以便新增使用者或群組。

若要安裝、建置及執行範例

  1. 確定您已執行 Windows Communication Foundation 範例的一次性安裝程序

  2. 若要建置方案的 C# 或 Visual Basic .NET 版本,請遵循 Building the Windows Communication Foundation Samples中的指示。

  3. 若要在單一或多部電腦組態中執行此範例,請遵循執行 Windows Communication Foundation 範例中的指示進行。

  4. 若要示範此服務模擬呼叫者,請使用與執行服務之帳戶不同的帳戶執行用戶端。 若要這麼做,請在命令提示字元輸入:

    runas /user:<machine-name>\<user-name> client.exe
    

    接著,提示您輸入密碼。 輸入先前指定帳戶的密碼。

  5. 當您執行用戶端時,請注意用戶端在使用不同認證執行前後所具有的身分識別。