7

У меня есть приложение ASP.NET MVC 5 с использованием ASP.NET Identity 2.1.0 для аутентификации пользователей.
Все прошло отлично, но теперь я узнал, что продолжающиеся сеансы пользователя больше не работают. Я не могу сказать, что изменение сломало, но он работал, когда я реализовал Идентичность (преобразованное приложение из SimpleMembership), и это моя логика у меня есть на данный момент:IsPersistent не работает - Cookie действительна только для текущей сессии

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, 
            model.RememberMe, shouldLockout: true); 

SignInManager это мой ApplicationSignInManager на основе SignInManager<ApplicationUser, int> и model.RememberMe есть true.

И моя установка:

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = ApplicationCookieIdentityValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
    }); 
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

Все работает отлично, за исключением сохраняющихся сессий пользователей. Я проверил файлы cookie, возвращенные моим сервером, и .AspNet.ApplicationCookie всегда возвращается как «действительный для текущего сеанса» вместо какой-либо даты в будущем. Поэтому, когда я закрываю и снова открываю браузер, мне нужно снова войти в систему ...

У кого-нибудь есть идея, почему это не работает (больше)?

PS: Я перекрываться SignInAsync в моем ApplicationSignInManager, потому что я сделать некоторые пользовательскую логику там, но я даже проверил с помощью отладчика и для следующего вызова:

await base.SignInAsync(user, isPersistent, rememberBrowser); 

isPersistent является true, поэтому он должен создать постоянное печенье.

+0

Я подозреваю, что 'validateInterval: TimeSpan.FromMinutes (0)' может вызвать это. Потому что по каждому запросу он регенерирует файл cookie и устанавливает новый. Попробуйте установить 'validateInterval' на что-то большее, чем 0, и посмотрите, работает ли это. – trailmax

+0

@trailmax: Спасибо, вот и все.Были ли изменения с V 2.1? Потому что он определенно работал в начале (с V 2.0). В любом случае: опубликуйте это как ответ, и я соглашусь с ним. Теперь я должен найти это, так как мне нужно (из-за SSO) валидации по каждому запросу. – ChrFin

ответ

6

This is a known bug in Identity и посмотри this answer не очень новый.

Когда cookie регенерируется по каждому запросу, флаг «IsPersisted» не установлен, когда даже в том случае, если он был установлен в исходном файле cookie.

Чтобы обойти это, вам нужно будет реализовать собственную версию валидатора cookie, которая установит флаг как есть.

Я думаю, что у меня есть решение для вас, но я его не компилировал и не тестировал - просто общее направление, в котором вам нужно идти. См. Это gist for full code.
Это всего лишь код SecurityStampValidator, взятый из декомпилятора. У меня есть added lines 91-96. В основном я беру флаг «IsPersistent» из предыдущего файла cookie и добавляю его в новый файл cookie, когда он создается. Это не было сделано в немодифицированной версии.

И тогда в вашем Auth.Config вы делаете:

Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 

Остерегайтесь, хотя, когда новая версия, проверьте, если это было зафиксировано, так что вы можете удалить грязную исправить. Эта проблема - reported to be fixed, но вскоре после того, как v2.1 вышел.

+1

Спасибо ОЧЕНЬ много. Поскольку у меня уже есть собственный валидатор (см. 'ApplicationCookieIdentityValidator' в моем коде), мне просто нужно было добавить туда свои изменения -> работать! – ChrFin

+0

@ChrFin Да, я заметил, что это имя отличается от стандарта. Рад, что это помогает! – trailmax

+0

красивый код! Похоже, что отсутствует 'using Microsoft.Owin.Security;' для доступа к типу 'AuthenticationProperties', хотя – Matthew

1

Обновление этой проблемы должно производиться как с AspNet.Identity.Core, так и с AspNet.Identity.Owin до 2.2.1.

+1

после обновления у него по-прежнему такая же проблема, и даже шаблон по умолчанию для asp.mvc для ядра Identity имеет ту же проблему. –

+0

yep, то же самое с идентификационным ядром ... –

+0

https://stackoverflow.com/questions/31946582/how-ispersistent-works-in-owin-cookie-authentication/46659752#46659752 –