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

В настоящее время я пытаюсь понять, как выполнить ручную проверку подлинности 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;
}

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


person codingbunny    schedule 24.01.2012    source источник
comment
Отличный вопрос - жду отличного ответа!   -  person Alex James    schedule 26.01.2012
comment
Я сомневаюсь, что таким образом можно смешивать формы и аутентификацию Windows. Для winauth вы должны включить его в IIS (потому что IIS - это тот, который проверяет эти учетные данные), а win-auth и forms-auth не могут работать вместе в некоторых настройках IIS (например, интегрированный пул приложений IIS7 +). Кроме того, есть только один режим авторизации, который вы можете указать в web.config. В классическом пуле приложений вы можете смешивать аутентификацию, но не в одних и тех же файлах / папках. Если это то, что вы используете, включите win-auth для определенной папки / файла / url-пути (например, обработчика aspx), затем используйте этот обработчик для аутентификации пользователей win / AD.   -  person    schedule 26.01.2012
comment
Попробуйте этот пост: stackoverflow.com/questions/2539038/   -  person Tjaart    schedule 26.01.2012
comment
Нам известно об использовании дополнительного сайта, но это последнее средство. Я очень надеюсь, что кто-то первым придумает решение проблемы.   -  person codingbunny    schedule 26.01.2012


Ответы (1)


Хорошо,

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

  • Создайте новое веб-приложение, которое будет работать внутри вашего приложения.
  • This sub-application relies on Windows Authentication
    • Disable Anonymous Authentication & Forms Authentication
  • Создайте страницу Login.aspx, которая обрабатывает аутентификацию Windows.
  • Мы генерируем cookie после входа в систему и перенаправляем в исходное приложение
  • Оригинальное приложение распознает cookie и принимает пользователя.

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

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

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

person codingbunny    schedule 26.01.2012