Подтвердить что ты не робот

Проверка удостоверения подлинности Windows

Я пытаюсь создать простой веб-сервис для аутентификации пользователей настольного приложения с использованием системы идентификации Windows, в настоящее время я передаю токен, сгенерированный WindowsIdentity.GetCurrent().

Токен через переменную post (она зашифрована и ssl'd, проверка подлинности Windows не является опцией, учитывая макет нашего домена и конфигурацию сервера). Я передаю токен обратно и преобразую его обратно в IntPtr.

Я теряюсь в том, как проверять токен, чтобы убедиться, что он был создан определенной Active Directory (или любой другой). Я попытался создать новый экземпляр WindowsIdentity, заданный токеном, однако это просто приводит к исключению ( "Invalid token for impersonation - it cannot be duplicated" ).

Если кто-то может предоставить любую помощь или даже подсказки, я бы очень признателен, спасибо заранее.

4b9b3361

Ответ 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 на нужное имя группы.)