Как сохранить сеанс живым после закрытия браузера в течение 15 минут с использованием Identity в Core 2.2? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть приложение, написанное с использованием C# поверх платформы ASP.NET Core 2.2.

Я использую Identity для управления пользователями и контроля пользователей.В настоящее время каждый раз, когда пользователь закрывает свой браузер и снова открывает приложение, он должен снова войти в систему.

Я хочу изменить имя входа из сеанса на файл cookie, срок действия которого истек через 15 минут после неактивности..

Вот что я добавил в класс запуска

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<User()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

    services.AddAuthentication()
            .AddFacebook(facebookOptions =>
    {
        facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
        facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
    });

    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    // This code should be executed after the identity id registered to work
    services.ConfigureApplicationCookie(config =>
    {
        config.SlidingExpiration = true;
        config.ExpireTimeSpan = TimeSpan.FromMinutes(15);
        config.Cookie.HttpOnly = true;
        config.Events = new CookieAuthenticationEvents
        {
            OnRedirectToLogin = ctx =>
            {
                if (ctx.Request.Path.StartsWithSegments("/api", StringComparison.CurrentCultureIgnoreCase))
                {
                    ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                }
                else
                {
                    ctx.Response.Redirect(ctx.RedirectUri);
                }

                return Task.FromResult(0);
            }
        };
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Как вы можете видеть выше, я добавил следующее

config.SlidingExpiration = true;
config.ExpireTimeSpan = TimeSpan.FromMinutes(15);
config.Cookie.HttpOnly = true;

Я ожидаю ExpireTimeSpan код для преобразования моего имени входа на основе сеанса в файл cookie.Также ожидаем cookie через 15 минут, если пользователь неактивен.SlidingExpiration должен обновлять время истечения срока действия файлов cookie при каждом запросе HTTP.

Как преобразовать вход в систему на основе сеанса в файл на основе файлов cookie?

1 Ответ

0 голосов
/ 24 декабря 2018

После долгих часов поиска в ASP.NET Core наконец-то я нашел для вас решение.

Перейдите к методу Login post и напишите свой _signInManager.PasswordSignInAsyncметод следующим образом:

var result = await _signInManager.PasswordSignInAsync(Email, Password, isPersistent: true, lockoutOnFailure: true);

Вот третий параметр для постоянного файла cookie.Согласно Документация Microsoft

IsPersistent Флаг, указывающий, должен ли файл cookie для входа сохраняться после закрытия браузера.

Для внешнего входа:

Перейдите к своему ExternalLoginCallback методу и напишите свой _signInManager.ExternalLoginSignInAsync метод следующим образом:

SignInResult signInResult = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: true);

Я проверил его на своей стороне, и он отлично работает!

...