代码之家  ›  专栏  ›  技术社区  ›  Junior

如何使用Core 2.2中的标识在浏览器关闭15分钟后保持会话活动?

  •  6
  • Junior  · 技术社区  · 6 年前

    C# 在ASP.NET核心2.2框架的顶部。

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

    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。这个 SlidingExpiration 应该在每个HTTP请求上更新cookie过期时间。

    1 回复  |  直到 6 年前
        1
  •  4
  •   TanvirArjel    6 年前

    在深入研究 ASP.NET核心标识

    去你的房间 Login _signInManager.PasswordSignInAsync 方法如下:

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

    下面是第三个参数,用于持久Cookie。根据 Microsoft Documentation

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

    对于外部登录:

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

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

    我已经在我这边测试过了,效果非常好!