У нас есть внутренняя система, в которой пользователи могут проходить аутентификацию с использованием аутентификации Windows, но мы хотим включить некоторый пользовательский контент в ответ 401, который переносит пользователя на страницу аутентификации пользовательского имени пользователя / пароля, если отменить отключить диалог аутентификации Windows.
Когда пользователь, не прошедший проверку подлинности, получает доступ к странице, проверка подлинности Windows отвечает 401 «Несанкционированный ответ» с заголовками
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
. В браузере отображается диалоговое окно с запросом учетных данных Windows.Если пользователь вводит свои учетные данные, существует другой запрос-ответ на рукопожатие, а затем пользователь проходит проверку подлинности и отображается запрошенная страница.
Если пользователь отменяет диалоговое окно, браузер отображает содержимое оригинального 401Несанкционированный ответ.Мы используем Application_EndRequest в Global.asax для возврата некоторого пользовательского содержимого, которое переносит пользователя в нашу пользовательскую систему входа в систему.
/// <summary>
/// If we are about to send the NTLM authenticate headers, include this content. Then, if the user cancels off the
/// windows auth dialog, they will be presented with this page and redirected to the username / password login screen
/// </summary>
void Application_EndRequest(object sender, EventArgs e)
{
Logger.DebugFormat("in Application_EndRequest. Response.StatusCode: {0}", Response.StatusCode);
if (Response.StatusCode == 401)
{
Response.ContentType = "text/html";
var redirectUrl = string.Format("https://mycompany.com/SSO/Login?encryptedSessionRequestId={1}",
HttpUtility.UrlEncode(Request.QueryString["encryptedSessionRequestId"]));
var text = File.ReadAllText(Server.MapPath("~/UnauthorizedError.html"));
text = text.Replace("[USERNAME_PASSWORD_LOGON_REDIRECT]", redirectUrl);
Response.Write(text);
Logger.Debug("Done writing response");
Response.End();
}
}
UnauthorizedError.html содержит следующий скрипт, который перенаправляет пользователя на
<script language="javascript" type="text/javascript">
window.location = "[USERNAME_PASSWORD_LOGON_REDIRECT]";
</script>
При локальном запуске (Win7 / IIS7.5) это прекрасно работает, мы используем Response.Write () для отправки нашего контента, и пользователь может видеть его, когда закрывает диалоговое окно.
Но при удаленном доступе к сайту, например, когда он работает в нашей среде разработки, хотя из журналов видно, что вызывается Application_EndRequest и наш контент записывается в ответ, в какой-то момент он переопределяется, и все, что достигает браузера, этозаголовки аутентификации и текст You do not have permission to view this directory or page.
1) Как мы можем предотвратить перезапись этого контента?
2) Где в конвейере это может происходить?
3) Есть ли у кого-нибудь предложения о другом способе реализации этого поведения, например, с помощью модуля HTTP?
Спасибо!