Aracılığıyla paylaş


İstemci Kimliğine Bürünme

Kimliğe Bürünme örneği, hizmetin çağıran adına sistem kaynaklarına erişebilmesi için hizmette çağıran uygulamasının kimliğine bürünmeyi gösterir.

Bu örnek, Kendi Kendine Konak örneğini temel alır. Hizmet ve istemci yapılandırma dosyaları, Kendi Kendine Konak örneğindekiyle aynıdır.

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Hizmet kodu, hizmetteki Add yönteminin aşağıdaki örnek kodda gösterildiği gibi öğesini kullanarak çağıranın kimliğine OperationBehaviorAttribute bürünmesi için değiştirilmiştir.

[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;
}

Sonuç olarak, yürütülen iş parçacığının güvenlik bağlamı, yöntemi girmeden Add önce çağıranın kimliğine bürünecek şekilde değiştirilir ve yöntemden çıkılırken geri döndürülür.

DisplayIdentityInformation Aşağıdaki örnek kodda gösterilen yöntem, çağıranın kimliğini görüntüleyen bir yardımcı program işlevidir.

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 Hizmetteki yöntemi, aşağıdaki örnek kodda gösterildiği gibi kesinlik temelli çağrıları kullanarak çağıranın kimliğine bürüner.

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;
}

Bu durumda çağıranın çağrının tamamı için kimliğine bürünülmediğini ancak çağrının yalnızca bir bölümü için kimliğine bürünüldüğünü unutmayın. Genel olarak, en küçük kapsam için kimliğe bürünmek, işlemin tamamı için kimliğe bürünme tercih edilir.

Diğer yöntemler çağıranın kimliğine bürünmez.

İstemci kodu, kimliğe bürünme düzeyini olarak ayarlamak için Impersonationdeğiştirildi. İstemci, numaralandırmayı kullanarak TokenImpersonationLevel hizmet tarafından kullanılacak kimliğe bürünme düzeyini belirtir. Numaralandırma şu değerleri destekler: None, Anonymous, Identificationve ImpersonationDelegation. Windows ACL'leri kullanılarak korunan yerel makinede bir sistem kaynağına erişirken erişim denetimi gerçekleştirmek için, aşağıdaki örnek kodda gösterildiği gibi kimliğe bürünme düzeyi olarak ayarlanmalıdır Impersonation.

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

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

Örneği çalıştırdığınızda, işlem istekleri ve yanıtları hem hizmet hem de istemci konsol pencerelerinde görüntülenir. Hizmeti ve istemciyi kapatmak için her konsol penceresinde ENTER tuşuna basın.

Not

Hizmet bir yönetim hesabı altında çalıştırılmalıdır veya URI'yi HTTP katmanına kaydetmek http://localhost:8000/ServiceModelSamples için altında çalıştığı hesaba hak verilmelidir. Bu tür haklar, Httpcfg.exe aracı kullanılarak bir Ad Alanı Ayırmasıayarlanarak verilebilir.

Not

Windows Server 2003 çalıştıran bilgisayarlarda, kimliğe bürünme yalnızca Host.exe uygulamanın Kimliğe Bürünme ayrıcalığına sahip olması durumunda desteklenir. (Varsayılan olarak, yalnızca yöneticiler bu izne sahiptir.) Hizmetin çalıştığı hesaba bu ayrıcalığı eklemek için, Yönetici istrative Tools'a gidin, Yerel Güvenlik İlkesi'ni açın, Yerel İlkeler'i açın, Kullanıcı Hakları Ataması'na tıklayın ve Kimlik Doğrulamasından Sonra İstemcinin Kimliğine Bürün'e tıklayın ve kullanıcı veya grup eklemek için Özellikler'e çift tıklayın.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  3. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.

  4. Hizmetin çağıranın kimliğine büründüğünü göstermek için istemciyi hizmetin altında çalıştığı hesaptan farklı bir hesap altında çalıştırın. Bunu yapmak için komut istemine şunu yazın:

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

    Ardından bir parola girmeniz istenir. Daha önce belirttiğiniz hesabın parolasını girin.

  5. İstemciyi çalıştırdığınızda, kimliği farklı kimlik bilgileriyle çalıştırmadan önce ve çalıştırdıktan sonra not edin.