У меня есть приложение ASP.NET MVC с некоторыми службами RESTful, которые я пытаюсь защитить с помощью пользовательской базовой аутентификации (они аутентифицируются по моей собственной базе данных). Я реализовал это, написав HTTPModule.
У меня есть один метод, присоединенный к событию HttpApplication.AuthenticateRequest, который вызывает этот метод в случае сбоя аутентификации:
private static void RejectWith401(HttpApplication app)
{
app.Response.StatusCode = 401;
app.Response.StatusDescription = "Access Denied";
app.CompleteRequest();
}
Этот метод присоединен к событию HttpApplication.EndRequest:
public void OnEndRequest(object source, EventArgs eventArgs)
{
var app = (HttpApplication) source;
if (app.Response.StatusCode == 401)
{
string val = String.Format("Basic Realm=\"{0}\"", "MyCustomBasicAuthentication");
app.Response.AppendHeader("WWW-Authenticate", val);
}
}
Этот код добавляет заголовок "WWW-Authenticate", который сообщает браузеру, что нужно вызвать диалоговое окно входа в систему. Это прекрасно работает, когда я отлаживаю локально с помощью веб-сервера Visual Studio. Но он не работает, когда я запускаю его в IIS7.
Для IIS7 у меня все встроенные модули аутентификации отключены, кроме анонимных. Он по-прежнему возвращает ответ HTTP 401, но, похоже, удаляет заголовок WWW-Authenticate.
Есть идеи?