2012-08-29 2 views
1

У нас есть приложение для входа в систему, которое разрешает пользователю регистрироваться только в одном сеансе в нашем приложении. Это делается в обработчике события postauthenticate request.Как отправить ответ 401 от HttpHandler?

Если пользователь должен выйти из системы (у них есть еще один сеанс) мы делаем:

FormsAuthentication.SignOut(); 
FormsAuthentication.RedirectToLoginPage(); 

Это работало отлично в течение длительного времени. Теперь мы добавляем веб-api в наше приложение. Когда вы попадаете в веб-api Url, событие PostAuthentication срабатывает, он видит, что пользователь зашел в другое место ... однако он перенаправляет логин .. ну, что ожидается из-за кода.

Я попытался изменить приведенный выше код, чтобы установить Response.StatusCode = 401, а затем завершить запрос. Ну, это хорошо работает, но asp.net «красив» и автоматически перенаправляется на страницу входа.

Есть ли способ ответить 401 и не перенаправлять его на страницу входа в систему, если этот запрос поступает из URL-адреса веб-сайта?

+2

301 не 401. 301 должен иметь '' Расположение: заголовок перенаправления, а 401 не. Не могли бы вы прояснить свой первоначальный вопрос, потому что вам ничего не мешает вам выполнить «Response.StatusCode = 401;», который должен работать нормально. – Dai

+0

извините, просто опечатка в моем вопросе. Я установил код состояния 401 ..., который заставляет asp.net перенаправляться на логин на основе проверки подлинности форм в web.config. – PilotBob

ответ

1

Проблема заключается в том, что модуль FormsAuthenticationModule улавливает все исходящие запросы в EndRequest, а если статус 401, а URL-адрес не является настроенным именем входа, вы перенаправляетесь в место входа.

Невозможно исправить это. В основном я видел два пути, ни один из которых не является удивительным:

  1. Внедрите свой собственный FormsAuthenticationModule. Вместо того, чтобы использовать готовый вариант, сверните свой собственный, который знает об исключениях и пропустит 401.
  2. Добавьте логику на страницу входа, которая выдает 401 для вас. Посмотрите на входящий URL. Если URL-адрес является одной из переадресаций из FormsAuthenticationModule, но пользователь уже зарегистрирован, введите 401, а не отобразит форму входа. FormsAuthModule не будет делать круговое перенаправление к форме входа, так что вы в порядке.
+0

Да, это то, чего я ожидал. Благодарю. То, что мы собираемся сделать, - это просто, чтобы наше мобильное приложение обнаружило 302 для login.aspx, и если оно увидит, что это 401, или смотреть, как пропущен аутлетит. Если мы создадим API, мы должны будем сделать что-то более надежное. – PilotBob

1

Вы можете установить SuppressFormsAuthenticationRedirect в HttpResponse к истине и модуль FormsAuthentication не будет ловить 401.

Смежные вопросы