Ручная проверка подлинности 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;
}

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

7
задан codingbunny 24 January 2012 в 15:38
поделиться