У меня есть приложение 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.
Есть идеи?