Проверка удостоверения подлинности Windows
Я пытаюсь создать простой веб-сервис для аутентификации пользователей настольного приложения с использованием системы идентификации Windows, в настоящее время я передаю токен, сгенерированный WindowsIdentity.GetCurrent()
.
Токен через переменную post (она зашифрована и ssl'd, проверка подлинности Windows не является опцией, учитывая макет нашего домена и конфигурацию сервера). Я передаю токен обратно и преобразую его обратно в IntPtr
.
Я теряюсь в том, как проверять токен, чтобы убедиться, что он был создан определенной Active Directory (или любой другой). Я попытался создать новый экземпляр WindowsIdentity
, заданный токеном, однако это просто приводит к исключению ( "Invalid token for impersonation - it cannot be duplicated
" ).
Если кто-то может предоставить любую помощь или даже подсказки, я бы очень признателен, спасибо заранее.
Ответы
Ответ 1
Ну,
Если я правильно понимаю ваш вопрос, я знаю, что это можно сделать, выполняя прямые API-вызовы. Ответ LogonUser в файле advapi32.dll. Следующий сниппет работал у меня
public class ActiveDirectoryHelper
{
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
public static bool Authenticate(string userName, string password, string domain)
{
IntPtr token;
LogonUser(userName, domain, password, 2, 0, out token);
bool isAuthenticated = token != IntPtr.Zero;
CloseHandle(token);
return isAuthenticated;
}
public static IntPtr GetAuthenticationHandle(string userName, string password, string domain)
{
IntPtr token;
LogonUser(userName, domain, password, 2, 0, out token);
return token;
}
}
Ответ 2
public bool DoesUserExist(string userName)
{
using (var domainContext = new PrincipalContext(ContextType.Domain, "DOMAIN"))
{
using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName))
{
return foundUser != null;
}
}
}
Чтобы проверить, существует ли пользователь. Это происходит из пространства имен и сборки System.DirectoryServices.AccountManagement
.
Просто введите свое имя пользователя, которое вы можете получить из WindowsIdentity.GetCurrent()
, и это вернет true/false, если пользователь будет в вашей группе. (замените DOMAIN на нужное имя группы.)