Реклама:

Извлечение ролей из билета

void OnPostAuthenticateobject sender, EventArgs e) {

HttpContext context = HttpContext.Cur rent;

if (context.Request.IsAuthenticated) {

// Извлечение ролей из билета

Formsldentity id = (Formsldentity)context.User.Identity; stringf] roles = id.Ticket.UserData.Split('|');

GenericPrincipal p = new GenericPrincipal (context.User.Identity, roles);

context.User = Thread.CurrentPrincipal = p: }

При кэшировании ролей вам все еще нужно периодически проверять изменения относительно членства в ролях. В противном случае эти изменения не вступят в силу до истечения срока действия билета. (Помните, это может произойти при использовании скользящих сроком или при наличии у клиента постоянного билета.) Реализация такой логики позволяет также проверять действительность учетной записи.

В принципе, вам нужно повторно добавить в билет время его действия, которое не будет автоматически обновляться инфраструктурой аутентификации Forms. Каждый раз по истечении срока действия билета повторно проверяются членство в ролях и статус учетной записи. Если роли были изменены, то обновленные роли снова со4 храняются в билете. Если учетная запись блокирована или удалена, очистите билет и выполните перенаправление на страницу регистрации. Для храпения срока действия вам нужно воспользоваться полем userData. В следующем примере кода показан метол создания обновленных билетов.

Кэширование ролей в билете путем указания времени ожидания

public static For(tisAuthent'icationTicket CreateAuthenticationTicket (string username, string[J roles, int timeout)

{

HttpContext context = HttpContext.Current;

// Задаем время ожидания кэширования ролей

DateTime rolesExpiration = DateTime.Now.AddMinutes(timeout);

string rolesExpirationString =

ruiesExpiration.ToStringC'yyyy.MM.dd.HH.mm.ss");

// Кодируем в билете роли и время ожидания

string rolesString = string.Join("|", roles);

string userData = rolesExpirationString + "|" + rolesString;

return CreateAuthenticationTicket(username. userOata);

В событии PostAuthenticateRequest для извлечения ролей и проверки срока действия применяется справочный метод. Если данные утратили силу, они снова будут извлечены из хранилища. При возникновении ошибки (например, из-за удаления пользователя) вы можете повторно аутентифицировать пользователя путем вызова методов FormsAuthentication.Signout и FormsAuthenticatüm-RedirectToLoginPage. Полный исходный код и справочную библиотеку аутентификации Forms, которые я использую в этой главе, можно загрузить с Web-сайта данной книги.

Путем конфигурирования всех этих настроек вы можете добиться следующих преимуществ:

■ максимально совместимой и удобной для пользователя системы с собственными учетными записями;

■ определяемых приложением ролей для пользователей;

■ возможности добавлять в билет собственные данные;

• кэширования информации о ролях с использованием времени ожидания, а также регулярной проверки учетных записей и ролей.

Web-фермы

Билеты аутентификации Forms можно многократно использовать в различных приложениях. Обычно так поступают тогда, когда на нескольких машинах работает одно и то же приложение со сбалансированной нагрузкой (так называемая Web-ферма) или когда нужно разрешить пользователям получать доступ к нескольким приложениям с регистрацией лишь на одном из них. (Волее подробную информацию вы найдете в разделе «Сценарии SSO»,)


⇐ Предыдущая страница| |Следующая страница ⇒