Asp.NET Identity устанавливает постоянный файл cookie, срок действия которого истекает через определенное время

Я написал следующий код, как показано ниже, чтобы обновить роли пользователей после того, как они подписались на мой веб-сайт, как показано ниже:

private void RefreshUserRoles()
{
    var AuthenticationManager = HttpContext.GetOwinContext().Authentication;
    var Identity = new ClaimsIdentity(User.Identity);

    Identity.RemoveClaim(Identity.FindFirst(ClaimTypes.Role));
    Identity.AddClaim(new Claim(ClaimTypes.Role, "Subscriber"));

    AuthenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(
        new ClaimsPrincipal(Identity), 
        new AuthenticationProperties { IsPersistent = true}
    );
}

Обратите внимание на эту строку кода:

AuthenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(
    new ClaimsPrincipal(Identity), 
    new AuthenticationProperties { IsPersistent = true}
    );

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

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

Итак, мои вопросы:

  1. Как установить срок действия cookie на 30 минут, после чего пользователю будет предложено повторно войти в систему.

  2. Как настроить повторную проверку файлов cookie пользователей, если срок их действия не истек в течение длительного времени, чтобы я мог сбросить их файлы cookie на обычного пользователя, если они отменили подписку?


person User987    schedule 17.02.2017    source источник
comment
Вы уверены, что это файл cookie и не проверяете аутентификацию перед тем, как предоставить им доступ к этим функциям?   -  person BillRuhl    schedule 17.02.2017
comment
@BillRuhl Да, 100%, я установил проверку при входе в систему, проверяю статус профиля подписки на PayPal, активен ли он, приостановлен или отменен ... Но проблема в том, что я обнаружил, что некоторые пользователи никогда не выходили из приложения (их много ), и этот файл cookie был оставлен в их браузере, чтобы никогда не истечь, и они отменили свою подписку, и если они никогда не войдут повторно, их подписка на моем веб-сайте практически никогда не истечет ...   -  person User987    schedule 17.02.2017
comment
Я не знаю, можно ли каким-то образом заставить приложение mvc заставить все файлы cookie истечь после доступа к веб-сайту ... Это немедленно решит мою проблему   -  person User987    schedule 17.02.2017
comment
Возможно, установить срок действия куки-файлов, который истечет при завершении сеанса браузера ... Но я не уверен, как это сделать   -  person User987    schedule 17.02.2017
comment
В некоторых моих приложениях MVC вы устанавливаете интервал проверки, известный как тайм-аут, в классе запуска. Должен быть метод configureAuth, который вы передаете CookieAuthenticationOptions. Один из вариантов - Provider, которому вы назначаете новый CookieAuthenticationProvider, который имеет свойство validateInterval и устанавливаете его равным TimeSpan.   -  person BillRuhl    schedule 17.02.2017
comment
@BillRuhl Не могли бы вы показать мне практический пример, чтобы я мог лучше понять? знак равно   -  person User987    schedule 17.02.2017
comment
@BillRuhl Да, я это вижу, я тоже установил его в своем приложении, хотя мой только что установил LoginPath и AuthenticationType   -  person User987    schedule 17.02.2017
comment
@BillRuhl Я не могу найти свойство validateInterval, я нашел только ValidateIdentity? \   -  person User987    schedule 17.02.2017
comment
Я выложу весь метод, одну секунду ...   -  person BillRuhl    schedule 17.02.2017
comment
@BillRuhl, ладно, спасибо, много =)   -  person User987    schedule 17.02.2017


Ответы (1)


Вот метод ConfigureAuth, о котором я говорил:

public void ConfigureAuth(IAppBuilder app)
{
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Controller/Action"),
        Provider = new CookieAuthenticationProvider
        {
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
        }
    });            
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

    app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

    app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
}

Вот как я его настроил, и он у меня работает.

person BillRuhl    schedule 17.02.2017
comment
Большое спасибо, я просто не могу понять, что это за классы ApplicationUserManager, ApplicationUser? Кажется, у меня их нет в моем приложении, так как я создал пустой проект mvc? - person User987; 17.02.2017
comment
используя Систему; с использованием Microsoft.AspNet.Identity; с использованием Microsoft.AspNet.Identity.Owin; с помощью Microsoft.Owin; с использованием Microsoft.Owin.Security.Cookies; с помощью Microsoft.Owin.Security.Google; using Owin; ..... это использование в верхней части моего начального класса - person BillRuhl; 17.02.2017
comment
Кажется, у меня есть все эти ссылки, кроме Microsoft.Owin.Security.Google, не знаете, какой это пакет? - person User987; 17.02.2017
comment
Вам это не понадобится, если вы не собираетесь разрешать пользователям аутентифицироваться с помощью своей учетной записи Google+. - person BillRuhl; 17.02.2017
comment
Хорошо, я установил это, не могли бы вы проверить, на какой класс ссылается ваш проект для этих классов: ApplicationUserManager, ApplicationUser, ApplicationSignInManager, ApplicationDbContext Мне кажется, что в моем проекте их нет? - person User987; 17.02.2017
comment
нет, тогда я исключу, не могли бы вы проверить ссылки для этих классов, упомянутых выше? - person User987; 17.02.2017
comment
UserManager взят из сборки Microsoft.AspNet.Identity.Core.dll, v2.0.0.0 другие определены в IdentityConfig.cs - person BillRuhl; 17.02.2017
comment
что это за приложение.UseTwoFactorSignInCookie (DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes (5)); И почему он установлен на 5 минут? знак равно - person User987; 17.02.2017
comment
Это используется для двухфакторной аутентификации ... поэтому, когда пользователь входит в систему, ему отправляется текстовое сообщение с кодом. Страница, на которую они перенаправляются и запрашивает код, получает cookie, действительный только в течение пяти минут. Если вы не собираетесь использовать двухфакторную систему, она вам действительно нужна. - person BillRuhl; 17.02.2017
comment
потрясающе спасибо !! =) Итак, в основном то, что делает этот OnValidateIdentity, - это проверяет браузер пользователя, чтобы увидеть, есть ли в нем файлы cookie, которые длиннее, чем xx минут или xx часов, если они старше установленного периода времени, он вынужден повторно войти в систему, нет? - person User987; 17.02.2017
comment
это да на мой предыдущий вопрос? XD - person User987; 17.02.2017
comment
Применимо ли это к пользователям, которые вошли в систему до того, как я ввел эту функцию безопасности? знак равно - person User987; 17.02.2017