Application_AuthenticateRequest: внутри этого события вы можете проверить, является ли пользователь членом роли Everyone. Если нет, вы можете добавить его автоматически. Это сдвигает задачу автоматического добавления пользователя к роли в точку аутентификации, которая по определению касается каждого пользователя. Чтобы сделать это, вы должны добавить в свой проект глобальный класс приложения и поместить в него приведенный ниже код.
Внимание! Конечно, вы должны поступать так только с низкопривилегированными ролями, такими как Everyone. Будет очень плохой идеей выполнять подобное действие с ролями другого типа.
void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (User != null)
{
if (User.Identity.IsAuthenticated && Roles.Enabled)
{
string EveryoneRoleName =
ConfigurationManager.AppSettings["EveryoneRoleName"];
if (!Roles.IsUserInRole(EveryoneRoleName) &&
Roles.RoleExists(EveryoneRoleName))
{
Roles.AddUserToRole(User.Identity.Name, EveryoneRoleName);
}
}
}
}
Приведенный код читает имя роли Everyone из конфигурационного файла, так что оно не кодируется жестко в приложении. Затем код использует класс Roles для проверки того, принадлежит ли уже данный пользователь к этой роли, и если нет, проверяет существование самой роли. Если пользователь не ассоциирован с ролью, но уже зарегистрирован в системе, вызывается метод Roles.AddUserToRole для программного добавления пользователя к роли Everyone.
Внимание! Вы могли бы решить, что в приведенном коде нужно использовать User.IsInRole(), однако это неправильно. Когда вызывается Application_AuthenticateRequest уровня приложения, сам RoleManagerModule еще не вызван. Поэтому RolePrincipal с ассоциацией пользователя и его ролей еще не создан, а потому вызов вроде User.IsInRole("Everyone") вернет false. Позднее в коде страницы, например, в процедуре Page_Load, RolePrincipal уже инициализирован, и вызов User.IsInRole("Everyone") отработает правильно.
Служба Roles снабжена поставщиком, интегрированным с ролями Windows для Windows-аутентификации — WindowsTokenRoleProvider. Этот поставщик извлекает информацию о членстве в группах Windows текущего зарегистрированного пользователя и предоставляет ее вашему приложению в том же виде, который вы видели выше в примере с SqlRoleProvider.
предыдущая следующая страница вначало главы оглавление
946