首页 > 解决方案 > 如何在浏览器关闭 15 分钟后使用 Core 2.2 中的 Identity 保持会话活动?

问题描述

C#我有一个基于 ASP.NET Core 2.2 框架编写的应用程序。

我正在使用身份进行用户管理和用户控制。目前,用户每次关闭浏览器并再次打开应用程序时,都需要重新登录。

我想将登录从会话更改为在 15 分钟不活动后过期的 cookie。

这是我添加到 Startup 类的内容

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 的登录。如果用户处于非活动状态,也会在 15 分钟后收到 cookie。应该更新每个 HTTP 请求的SlidingExpirationcookie 过期时间。

如何将基于会话的登录转换为基于 cookie 的登录?

标签: c#asp.net-coreidentityasp.net-core-2.1asp.net-core-2.2

解决方案


在深入研究ASP.NET Core 身份数小时后,我终于找到了适合您的解决方案。

转到您的post 方法并按如下Login方式编写您的方法:_signInManager.PasswordSignInAsync

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

这是第三个参数,用于持久 Cookie。根据微软文档

IsPersistent指示登录 cookie 是否应在浏览器关闭后保留的标志。

对于外部登录:

转到您的ExternalLoginCallback方法并编写_signInManager.ExternalLoginSignInAsync方法如下:

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

我已经在我身边测试过它,它工作得很好!


推荐阅读