2014-08-28 1 views
9

У меня есть 2 вопроса, связанный с что:Как аннулировать .AspNet.ApplicationCookie после добавления пользователя в роль с использованием Asp.Net Identity 2?

1) Мне нужно invalidate.AspNet.ApplicationCookie после добавления/ Удаления некоторого удаленного пользователя к роли, используя Asp.Net Идентичность 2. Я попытался использования UpdateSecurityStamp, но поскольку ни один пароль или имя пользователя не изменен , SecurityStamp остается таким же. Когда я использую ApplicationRoleManger , я вижу, что роли пользователей обновляются, но в User.Identity Claims они остаются без изменений.

2) Как работает .ApNet.ApplicationCookie Проверка работы и как я могу получить к ней доступ?

Я пытался использовать этот код, но без эффекта

What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface?

Update: Это моя установка Cookie Auth:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromSeconds(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)), 
       OnApplyRedirect = ctx => 
       { 
        if (!IsApiRequest(ctx.Request)) 
        { 
         ctx.Response.Redirect(ctx.RedirectUri); 
        } 
       } 
      } 
     }); 

Я могу видеть, что user.GenerateUserIdentityAsync (менеджер) отображается только при входе в систему.

ответ

8

Настройка CookieAuthenticationOptions недостаточно. Когда я создал новый проект ASP.NET MVC в VS, все работает хорошо, и GenerateUserIdentityAsync() удаляется каждым запросом (если validateInterval равен 0). Единственная проблема заключалась в том, что вы должны зарегистрировать контекст по запросу:

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

Как я использую Winsdor замок, чтобы создать контекст для каждого запроса, я удалил эти строки из шаблона. В инъецированном методе в ApplicationUserManager.Create установлен UserTokenProvider, который делает магические перхарпы.

Нигде в документации нет ничего об этом, но, наконец, оно решает проблему.

Если вы используете свой собственный IoC, вы можете разрешить зависимость таким образом

app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationDBContext>()); 
app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationUserManager>()); 

и зарегистрировать Типы таким образом (например, с помощью замка Winsdor.):

container.Register(Component.For<ApplicationDBContext>().LifestylePerWebRequest()); 
container.Register(Component.For<ApplicationUserManager>().LifestylePerWebRequest()); 
+1

Отличный улов! Я полностью пропустил это сам. Рад, что это сработало для вас! – trailmax

5

Если вы хотите изменить метку безопасности после добавления к применению роль в этом:

UserManager.UpdateSecurityStampAsync(User.Id) 

не установлен validateInterval к TimeSpan.FromSeconds(0) - это в основном означает, что база данных будет хит каждый по запросу. Установите его примерно на 10 минут.

Только вчера вечером I've blogged about CookieAuthenticationProvider и как это делает недействительным печенье. В основном cookie содержит информацию о времени его создания. Если он старше validateInterval, то дойдите до базы данных, получите регистрацию пользователя и сравните штампы безопасности в cookie и в БД. Если штамп не изменился, выпустите новый файл cookie с новой датой выпуска. Если штампы не совпадают, аннулировать пользователя cookie и пользователя.

+0

Спасибо за вашу ссылку блога! Кажется, что я все еще что-то пропустил, потому что, как я уже сказал, метод GenerateUserIdentityAsync запускается только при входе в систему - так как OnValidateIdentity.И файл cookie остается таким же, даже если я вызываю UpdateSecurityStampAsync (User.Id). Btw У меня есть нулевой Timespan только для тестирования. Есть ли что-то еще, чего мне не хватает в конфигурации аутентификации? –

+0

попробуйте убить все файлы cookie и снова войти в систему – trailmax

+0

Я делал это много раз. Разве не проблема в том, что SecurityStampValidator.OnValidateIdentity проверяет SecurityStamp и UserId - и они остаются такими же? Таким образом, никаких изменений не обнаружено? –

Смежные вопросы