Когда проверяется билет .NET FormAuthentication и как я могу подключиться к этому событию? - PullRequest
1 голос
/ 21 апреля 2010

Мы пытаемся интегрировать сайт ASP.NET MVC с системой единого входа нашего клиента, используя PingFederate. Я хотел бы использовать встроенную платформу FormsAuthentication для этого. Я до сих пор об этом говорил:

  1. Настройте мой Web.config таким образом, чтобы мой FormsAuthentication LoginURL переходил к действию «BeginAuthentication» моего сайта на контроллере «Security». Из этого действия я установил некоторые переменные сеанса (например, по какому URL-адресу обращались, поскольку Ping не будет отправлять мне эту информацию), а затем перенаправил на страницу входа нашего клиента на внешнем сайте (www.client. com / Войти, например).

  2. Отсюда происходит аутентификация, и в том же домене, где работает наше приложение, создается файл cookie, содержащий уникальный идентификатор аутентифицированного пользователя. Я настроил его так, чтобы однажды в этом случае Ping-сервер перенаправляет на мое действие «EndAuthentication» на моем контроллере «Security».

  3. В этом действии я вызываю метод ValidateUser моего класса членства, который берет этот уникальный идентификатор из файла cookie и загружает пользователя в наше приложение, к которому относится этот идентификатор. Я сохраняю этого зарегистрированного пользователя в нашей Сессии (например, Session ["LoggedInAs"]) и истекаю файл cookie, содержащий идентификатор аутентифицированного пользователя, предоставленного мне системой единого входа.

Все это работает хорошо. Вопрос, который меня интересует, заключается в том, что происходит после того, как наш пользователь уже прошел аутентификацию и вручную возвращается на страницу входа нашего клиента (www.client.com/login) и входит в систему как другой пользователь. Если они это сделают, то переход от № 2 выше к номеру 3 будет происходить как обычно - но, поскольку на нашем сайте уже существует аутентифицированный пользователь, создается впечатление, что система FormsAuthentication ничего не беспокоит, поэтому я не получить возможность проверить файл cookie, который я ищу, чтобы войти в систему как этот новый пользователь. Что я хотел бы сделать, так это где-нибудь в моем файле Global.asax (возможно, FormsAuthenticate_OnAuthenticate) проверить, существует ли файл cookie, который система SSO отправляет мне, и, если это так, выйти из приложения с помощью FormsAuthentication.SignOut ( ).

Другая проблема, которая, кажется, связана с этим, заключается в том, что, если я позволю истечь сроку моей Сессии, FormsAuthentication все равно будет считать меня аутентифицированным, и это позволит мне получить доступ к странице, даже если в моей Сессии нет зарегистрированного пользователя, поэтому страница не отображается правильно Должен ли я подключиться к событию Session_End и сделать здесь FormsAuthentication.SignOut ()?

По сути, я хочу знать, когда билет аутентификации создан System.Web.Security.FormsAuthentication.SetAuthCookie (..) проверяется в потоке запроса, чтобы я мог определить, нужно ли мне SignOut () и принудительно выполнить повторную проверку или нет.

Спасибо за любую помощь. Извините за длину этого сообщения, пытаюсь быть максимально подробным.

Mustafa

Ответы [ 3 ]

1 голос
/ 21 апреля 2010

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

Срок действия файла cookie (сколько времени ASP.NET чувствует, что ему нужно снова запросить пароль) и как вы управляете состоянием, не связаны. Аутентификация ASP.NET основана на использовании файлов cookie, поэтому, если разработчик захочет, он может отключить состояние представления, сеанс, не использовать строки запроса или скрытые поля, а аутентификация все еще работает.

Если вы хотите связать интервал, с которым вы запрашиваете пароль, с тем, как вы сохраняете данные, то вы захотите, чтобы срок действия вашей сессии был примерно таким же, как и срок действия файлов cookie, но они никогда не будут полностью совпадать. Было бы лучше иметь две политики (одна для того, как быстро вы отбрасываете данные сеанса пользователя, а другая для того, как долго вы готовы ждать, прежде чем вам потребуется повторно запрашивать пароль)

1 голос
/ 22 апреля 2010

Добро пожаловать в небольшой раздел Hades, который смешивает сессию с Formauth.

Если ваши потребности настолько сложны, как представлено, вы получите больше времени для сна, если внедрите полный стек провайдеров для совместного использования среди участвующих сайтов. Я знаю, легче сказать, чем сделать.

Но чтобы ответить на ваш вопрос:

из http://www.codeproject.com/Articles/39026/Exploring-Web-config-system-web-httpModules.aspx

По дороге в .... Проверить билет и установить личность @

app.AuthenticateRequest += System.Web.Security.FormsAuthenticationModule.OnEnter-->OnAuthenticate

На выходе ... установить тикет и при необходимости перенаправить

app.EndRequest += System.Web.Security.FormsAuthenticationModule.OnLeave

Отражатель ваш друг. ; -)

1 голос
/ 21 апреля 2010

Я не знаю о конкретном событии, когда проверяется cookie, но вы можете поместить соответствующую логику в Application_BeginRequest() и проверить там состояние аутентификации пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...