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