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