"Подання себе" в просторі .NET, як правило, означає виконання коду під певним обліковим записом користувача. Це дещо окрема концепція, ніж отримання доступу до цього облікового запису користувача через ім’я користувача та пароль, хоча ці дві ідеї поєднуються часто. Я опишу їх обох, а потім поясню, як використовувати мою бібліотеку SimpleImpersonation , яка використовує їх внутрішньо.
Уособлення
API для представлення себе в Інтернеті надаються в .NET через System.Security.Principal
простір імен:
Як правило, слід використовувати новіший код (.NET 4.6+, .NET Core тощо) WindowsIdentity.RunImpersonated
, який приймає ручку до маркера облікового запису користувача, а потім або код Action
або Func<T>
для виконання коду.
WindowsIdentity.RunImpersonated(tokenHandle, () =>
{
// do whatever you want as this user.
});
або
var result = WindowsIdentity.RunImpersonated(tokenHandle, () =>
{
// do whatever you want as this user.
return result;
});
Старий код використовував WindowsIdentity.Impersonate
метод для отримання WindowsImpersonationContext
об'єкта. Цей об'єкт реалізується IDisposable
, тому загалом його слід викликати з using
блоку.
using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(tokenHandle))
{
// do whatever you want as this user.
}
Хоча цей API все ще існує у .NET Framework, його, як правило, слід уникати та недоступний у .NET Core або .NET Standard.
Доступ до облікового запису користувача
API для використання імені користувача та пароля для отримання доступу до облікового запису користувача в Windows LogonUser
- це рідний API Win32. Наразі не існує вбудованого API .NET для його виклику, тому потрібно вдатися до P / Invoke.
[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);
Це основне визначення виклику, однак є набагато більше, що слід розглянути, як реально використовувати його у виробництві:
- Отримання ручки за схемою "безпечного" доступу.
- Закрийте рідні ручки відповідним чином
- Рівні довіри безпеки доступу до коду (CAS) (лише в .NET Framework)
- Проходить,
SecureString
коли ви можете безпечно зібрати його за допомогою клавіш користувача.
Кількість коду, який потрібно записати, щоб проілюструвати все це, виходить за рамки того, що повинно бути у відповіді StackOverflow, IMHO.
Комбінований та простіший підхід
Замість того, щоб писати все це самостійно, подумайте про використання моєї бібліотеки SimpleImpersonation , яка поєднує втілення себе та особистий доступ в єдиний API. Він добре працює як у сучасних, так і в старих базах коду, з тим же простим API:
var credentials = new UserCredentials(domain, username, password);
Impersonation.RunAsUser(credentials, logonType, () =>
{
// do whatever you want as this user.
});
або
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, але не вимагає нічого знати про ручки маркера.
Це API за версією 3.0.0. Детальнішу інформацію див. У розділі readme проекту. Також зауважте, що в попередній версії бібліотеки використовувався API з IDisposable
малюнком, подібним до WindowsIdentity.Impersonate
. Новіша версія набагато безпечніша, і обидві досі використовуються всередині країни.