Обновите поставщик ролей ASP.NET - PullRequest
3 голосов
/ 05 января 2010

простой вопрос ...

Учитывая, что у меня есть сайт ASP.NET, который использует [custom] RoleProvider,
Есть ли способ, которым я могу как-то «обновить» провайдера, не заставляя пользователя выходить из сайта и снова входить в систему?

Я ищу что-то похожее на вымышленный метод

Roles.Refresh()

В частности, я смотрю на это, если администратор меняет роли пользователя, сеансы пользователя могут обновляться каждые 10 минут или что-то в этом роде.

Ответы [ 5 ]

4 голосов
/ 03 марта 2010

Я полагаю, у вас есть что-то подобное в вашем web.config:

<roleManager enabled="true" defaultProvider="..." 
             cacheRolesInCookie="true">

Роли кэшируются в cookie , поэтому вы можете принудительно обновить их, удалив cookie . Этот метод работал для меня. Я добавил атрибут cookieName, чтобы не полагаться на настройки по умолчанию для asp.net. Однако для вашего сценария вы можете просто установить для атрибута cookieTimeout что-то разумное и покончить с этим.

Этот метод, конечно, не обновит роли немедленно. Они будут обновлены при следующей загрузке страницы после удаления файла cookie.

3 голосов
/ 26 января 2012

Обновить просто нужно удалить куки:

Для C #: Roles.DeleteCookie(); // Работает как Roles.Refresh ()

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

Если вы не хотите использовать куки, вы можете использовать объект Session для кэширования ролей. как это:

        public override string[] GetRolesForUser(string username)
    {
        System.Web.SessionState.HttpSessionState Session = HttpContext.Current.Session;
        if (Session["roles"] == null)
                Session["roles"] = MyDataProvider.Security.GetRolesForUser(username);
        return (string[])Session["roles"];
    }

Когда вам нужно обновить роли для этого пользователя, вы можете сделать

Session["roles"] = null
0 голосов
/ 17 октября 2010

Роли кэшируются в куки (зашифрованы, конечно). Простейшим решением будет отключить кэширование в файле web.config. Вы потеряете некоторую производительность.

В противном случае вы должны как-то повторно отправить файл cookie аутентификации. Одна из основных проблем заключается в том, что многие браузеры не принимают файлы cookie при перенаправлениях с методом post.

Другое решение, которое сработало для меня:

1) В методе aspx выйдите из системы и сохраните имя пользователя в сеансе

// Добавить пользователя в анализатор ролей и обновить заявку

Roles.AddUserToRole(User.Identity.Name, Constants.ROLE_REVISOR);
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(User.Identity.Name, false); //Might work in some browsers
Session["REFRESHROLES"] = User.Identity.Name;
Response.Redirect("someprotectedurl?someid=" + someid);

2) На странице входа снова войдите в систему, если имя пользователя сохранено в сеансе

protected void Page_Load(object sender, EventArgs e)
{
   string returnUrl = Request.QueryString["ReturnUrl"];
   if(String.IsNullOrEmpty(returnUrl) == false)
   {

         if(Session["REFRESHROLES"] != null)
         {
            if(!string.IsNullOrEmpty(Session["REFRESHROLES"].ToString()))
            {

               FormsAuthentication.SetAuthCookie(Session["REFRESHROLES"].ToString(), false);
               Session.Remove("REFRESHROLES");
               Response.Redirect(returnUrl);  
               return;
            }
         }
0 голосов
/ 05 января 2010

зависит от используемого поставщика пользовательских ролей.

Просто вызывать функцию "обновить мою роль" при каждом запросе? (плохой путь, но, по крайней мере, вы обязательно обновите его)

...