Asp.net формирует цикл авторизации

Как вы решаете проблему бесконечного цикла входа в систему, когда вы используете сеансы без файлов cookie и не можете изменить имя login.aspx на httphandler?

т.е. когда пользователь с правами администратора нажимает кнопку выхода из системы и URL-адрес возврата на страницу с ограниченным доступом передается в login.aspx, тогда другой пользователь без прав администратора пытается войти в систему, и он перенаправляется обратно на страницу входа.

Я сталкивался с этим решением, но я не могу изменить имя login.aspx на обработчик http, и функция isauthenticated, похоже, не работает на странице aspx с auth без cookie, потому что билет проверки подлинности форм, кажется, удаляется из URL при перенаправлении обратно на страницу входа.

РЕДАКТИРОВАТЬ:

Поскольку это приложение уже работает, я не могу изменить поток страниц процесса входа в систему / выхода из системы / времени ожидания или переименовать страницу входа в систему.

6 ответов

Решение

Проверьте, авторизован ли пользователь для доступа к странице в returnUrl, после входа на страницу login.aspx. Вы можете использовать этот метод UrlAuthorizationModule (или пользовательский, если он вам подходит):

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(

     returnUrl,
     userPrincipal, 
     GET");

Если пользователь не авторизован, просто перенаправьте на страницу, к которой у него есть доступ.

Чтобы получить пользователя Принципал:

var roles = System.Web.Security.Roles.GetRolesForUser(username);

var principal = new System.Security.Principal.GenericPrincipal(

   new System.Security.Principal.GenericIdentity(username), 

   roles

);

У нас была похожая проблема, и я исправил ее следующим образом:

If "LogOut".Equals(e.CommandName) Then
    FormsAuthentication.SignOut()
    Response.Redirect("~/Login.aspx")
End If

И затем в Login.aspx мы меняем PostBackUrl на Login.aspx, если он содержит параметр ReturnUrl, который отправляет пользователя обратно в Login.aspx.

Несколько вариантов...

Во-первых, перенаправить вручную обратно на Login.aspx, когда пользователь вышел из системы, поэтому ReturnURL отсутствует. Создайте на своих страницах мета-обновление, соответствующее времени ожидания сеанса, чтобы пользователь не нажимал на ресурсы, к которым он внезапно не смог добраться.

Во-вторых, всегда выходите из системы в Page_Load файла Login.aspx. Эй, а почему бы и нет? Я могу подумать о некоторых причинах, но, возможно, они не относятся к вашей ситуации.

Три, игнорируйте ReturnURL. Вам не нужно вызывать RedirectFromLoginPage! Перенаправить пользователя на целевую страницу по умолчанию при входе в систему.

Как насчет добавления модуля http, который проверяет, является ли Request.UrlReferrer страницей входа в систему, и, если это так, проверяет, авторизованы ли они для доступа к Request.Url и, если нет, перенаправляет их на "Вы не авторизованы для просмотра этой страницы". стр.

Хотя вы говорите, что не можете изменить имя login.aspx на обработчик HTTP, пытались ли вы добавить перенаправление HTTP 301, чтобы при каждом запросе login.aspx сервер перенаправлял пользователя на обработчик HTTP, например login.ashx?

Не могли бы вы изменить поток страниц?

Я имею в виду, что вместо того, чтобы перенаправлять обратно на страницу login.aspx, когда у пользователя нет доступа к ресурсу, перенаправьте его на информационную страницу.

На этой странице объясняются причины переадресации и предлагаются такие параметры, как:

1. Click here to login as another user.
2. Click here to request access to the page.
3. Click here to login again, if your session has expired.

Это устранит круговую ссылку и, следовательно, проблему.

Другие вопросы по тегам