Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kimliğe Bürünme örneği, hizmetin çağıran uygulamanın kimliğine bürünerek, çağıran adına sistem kaynaklarına erişebilmesini gösterir.
Bu örnek, Kendi Kendine Barındırma örneğini temel alır. Hizmet ve istemci yapılandırma dosyaları, Self-Host örneğiyle aynıdır.
Uyarı
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 OperationBehaviorAttribute kullanarak çağıranın kimliğine 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ı, Add yöntemine girmeden önce çağıranın kimliğine bürünecek şekilde değiştirilir ve yöntemden çıkarken eski haline getirilir.
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;
}
Hizmetteki \Subtract yöntemi, aşağıdaki örnek kodda gösterildiği gibi emredici çağrıları kullanarak çağıranın kimliğine bürünür.
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 Impersonation olarak ayarlamak üzere değiştirildi. İstemci, hizmet tarafından kullanılacak kimliğe bürünme düzeyini, TokenImpersonationLevel enumarasyonu kullanarak belirler. 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.
Uyarı
Hizmet, ya bir yönetim hesabı altında çalıştırılmalı ya da çalıştığı hesaba HTTP katmanında http://localhost:8000/ServiceModelSamples URI'sini kaydetme hakkı verilmelidir. Bu tür haklar ,Httpcfg.exe aracı kullanılarak bir Ad Alanı Rezervasyonu ayarlanarak verilebilir.
Uyarı
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önetim Araçları'na 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
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.
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.exeArdından bir parola girmeniz istenir. Daha önce belirttiğiniz hesabın parolasını girin.
İstemciyi çalıştırdığınızda, farklı kimlik bilgileriyle çalıştırmadan önce ve sonra kimliği not alın.