У меня есть приложение MVC ASP.NET с некоторыми УСПОКОИТЕЛЬНЫМИ сервисами, что я пытаюсь защитить использующую пользовательскую стандартную аутентификацию (они аутентифицируются против моей собственной базы данных). Я реализовал это путем записи 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 - Аутентифицирует" заголовок, который говорит браузеру подбрасывать диалоговое окно входа в систему. Это работает отлично, когда я отлаживаю локально веб-сервер Visual Studio использования. Но это перестало работать, когда я выполняю его в IIS7.
Для IIS7 у меня есть встроенные модули аутентификации все выключенные, кроме анонимного. Это все еще возвращает ответ HTTP 401, но это, кажется, удаляет WWW - Аутентифицируют заголовок.
Какие-либо идеи?
Я разобрался. Проблема заключалась в том, что я назвал этот модуль «BasicAuthenticationModule», который конфликтовал с другим модулем, встроенным в IIS. После того, как я переименовал модуль, все заработало!
Несмотря на то, что он у вас работает, стоит еще подумать об этом: