Ручная проверка подлинности Windows - PullRequest
7 голосов
/ 24 января 2012

В настоящее время я пытаюсь выяснить, как выполнить аутентификацию Windows вручную в нашем приложении ASP.NET. Проблема в том, что у нас запущена служба OData, и мы используем FormsAuthentication для предоставления общего механизма входа в систему и разрешения глаголов PUT & DELETE для OData, включая перенаправления форм.

Однако для некоторых клиентов мы интегрировали проверку подлинности Windows, чтобы обеспечить плавную интеграцию их пользователей с активным каталогом. Теперь проблема в том, что мы хотим иметь возможность переключать методы аутентификации, не нарушая службу Odata, потому что мы зависим от нее.

То, что мы пытаемся сделать, - это имитировать механику аутентификации Windows с помощью IhttpModule. Пока что мы можем включать и выключать эту функцию, и мы получаем вызов, когда сделан запрос. Чего я не знаю, так это как использовать полученную информацию из браузера для выполнения аутентификации по активному каталогу:

Это код, который мы используем для извлечения информации NTLM из текущего запроса:

/// <summary>
/// <para>Determines whether the current <see cref="HttpRequest"/> is a NTML challenge.</para>
/// </summary>
/// <param name="request">The <see cref="HttpRequest"/> to evaluate.</param>
/// <param name="header">The output header to authenticate.</param>
/// <returns>True if the current <see cref="HttpRequest"/> is considered a NTML challenge.</returns>
 protected bool IsNtlmChallenge(HttpRequest request, out string header)
 {
      const string headerName = @"Authorization";
      if (request.Headers.AllKeys.Contains(headerName))
      {
           header = request.Headers[headerName];
           return true;
      }

      header = string.Empty;
      return false;
 }

Это позволяет нам извлечь заголовок из запроса. Теперь мне нужно знать, как я выполняю аутентификацию с этим в активном каталоге.

Это логика, которую мы используем для извлечения информации:

// Check if we need to handle authentication through Windows authentication or not.
if (WindowsAuthentication)
{
    string encryptedHeader;

    // If this is a challenge from the client, perform the Windows Authentication using the 
    // information stored inside the header.
    if(IsNtlmChallenge(HttpContext.Current.Request, out encryptedHeader))
    {
         /* how to authenticate here with the encrypted header? */
    }

    HttpContext.Current.Response.AddHeader("WWW-Authenticate", "NTLM");
    HttpContext.Current.Response.StatusCode = 401;
    return;
}

Надеюсь, кто-нибудь сможет предоставить мне нужный ответ.

1 Ответ

0 голосов
/ 26 января 2012

Хорошо

Основываясь на комментариях, полученных по моему вопросу, я нашел следующее решение, чтобы обойти эту проблему. Я знаю, что это не чистое решение, но, по крайней мере, оно работает для нас.

  • Создайте новое веб-приложение, которое будет работать внутри вашего приложения
  • Это суб-приложение использует аутентификацию Windows
    • Отключить анонимную аутентификацию и аутентификацию по формам
  • Создать страницу Login.aspx, которая обрабатывает аутентификацию Windows
  • Мы генерируем куки после входа в систему и перенаправляем на исходное приложение
  • Оригинальное приложение распознает куки и забирает пользователя.

Для этого требуется, чтобы мы генерировали одинаковые ключи для шифрования и дешифрования для обоих приложений. Это можно установить с помощью модуля машинного ключа в диспетчере IIS для вашего приложения. Если ключи не совпадают для обоих приложений, процесс кодирования / декодирования для cookie завершится ошибкой . Мы настроили их на автоматическую генерацию с использованием SHA1, но одинаковые ключи для обоих приложений.

Теперь мы проверяем настройки на исходной странице входа, перенаправляем на страницу входа в подпрограмму, если требуется проверка подлинности Windows, и выполняем там вход. Затем мы перенаправляем обратно на исходную страницу входа и используем файл cookie для продолжения.

Это приводит к нескольким перенаправлениям при первоначальном входе в систему, но после этого приложение работает как обычно.

...