.NET alanındaki "Kimliğe bürünme" genellikle kodun belirli bir kullanıcı hesabı altında çalıştırılması anlamına gelir. Bu kullanıcı hesabına bir kullanıcı adı ve parola ile erişmekten biraz ayrı bir kavramdır, ancak bu iki fikir sık sık birlikte eşleşir. Her ikisini de açıklayacağım ve sonra bunları dahili olarak kullanan SimpleImpersonation kütüphanemi nasıl kullanacağımı açıklayacağım .
Impersonation
Kimliğe bürünme API'leri, System.Security.Principal
ad alanı üzerinden .NET'te sağlanır :
Genel WindowsIdentity.RunImpersonated
olarak, kullanıcı hesabının belirtecine yönelik bir tanıtıcı kabul eden ve daha sonra kodun yürütülmesi için ya da bir Action
veya kabul eden daha yeni kod (.NET 4.6+, .NET Core, vb.) Kullanılmalıdır Func<T>
.
WindowsIdentity.RunImpersonated(tokenHandle, () =>
{
// do whatever you want as this user.
});
veya
var result = WindowsIdentity.RunImpersonated(tokenHandle, () =>
{
// do whatever you want as this user.
return result;
});
Eski kod, WindowsIdentity.Impersonate
bir WindowsImpersonationContext
nesneyi almak için yöntemi kullandı . Bu nesne uygulanır IDisposable
, bu nedenle genellikle bir using
bloktan çağrılmalıdır .
using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(tokenHandle))
{
// do whatever you want as this user.
}
Bu API hala .NET Framework'te mevcut olsa da, genellikle bundan kaçınılmalıdır ve .NET Core veya .NET Standard'da mevcut değildir.
Kullanıcı Hesabına Erişim
Windows'ta bir kullanıcı hesabına erişmek için kullanıcı adı ve parola kullanma LogonUser
API'sı Win32 yerel API'sıdır. Şu anda çağırmak için yerleşik bir .NET API yok, bu yüzden bir P / Invoke başvurmak gerekir.
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
Bu temel çağrı tanımıdır, ancak bunu aslında üretimde kullanmayı düşünecek çok daha fazla şey vardır:
- "Güvenli" erişim desenine sahip bir tutamak elde edilmesi.
- Yerel tutamakları uygun şekilde kapatma
- Kod erişim güvenliği (CAS) güven düzeyleri (yalnızca .NET Framework'te)
SecureString
Kullanıcı tuş vuruşlarıyla güvenli bir şekilde toplayabildiğiniz zaman geçme .
Tüm bunları göstermek için yazılacak kod miktarı, bir StackOverflow cevabı IMHO'da olması gerekenin ötesindedir.
Kombine ve Daha Kolay Bir Yaklaşım
Tüm bunları kendiniz yazmak yerine , kimliğe bürünme ve kullanıcı erişimini tek bir API'de birleştiren SimpleImpersonation kitaplığımı kullanmayı düşünün . Aynı basit API ile hem modern hem de eski kod tabanlarında iyi çalışır:
var credentials = new UserCredentials(domain, username, password);
Impersonation.RunAsUser(credentials, logonType, () =>
{
// do whatever you want as this user.
});
veya
var credentials = new UserCredentials(domain, username, password);
var result = Impersonation.RunAsUser(credentials, logonType, () =>
{
// do whatever you want as this user.
return something;
});
WindowsIdentity.RunImpersonated
API'ya çok benzediğini , ancak jeton tanıtıcıları hakkında hiçbir şey bilmenizi gerektirmediğini unutmayın.
3.0.0 sürümündeki API budur. Daha fazla ayrıntı için proje benioku dosyasına bakın. Ayrıca, kitaplığın önceki bir sürümünün IDisposable
, benzer bir API kullandığını unutmayın WindowsIdentity.Impersonate
. Yeni sürüm çok daha güvenli ve her ikisi de hala dahili olarak kullanılıyor.