【问题标题】:Cookie.ExpireTimeSpan ignored and set to Session in CookieAuthenticationCookie.ExpireTimeSpan 被忽略并在 CookieAuthentication 中设置为 Session
【发布时间】:2020-05-28 10:13:03
【问题描述】:

我在尝试在我的 CookieAuthentication 中设置 cookie 的 expire 时间时遇到问题,似乎 ExpireTimeSpan 只是被忽略了,当我在浏览器中获取 cookie 时它的过期时间设置为Session..

我正在使用带有 .NET Core 3.1 的 c# 8.0,这是我的 ConfigureService 代码:

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options => {
            options.Cookie.Name = "authToken";
            options.ExpireTimeSpan = TimeSpan.FromMinutes(120);
            options.Events = new CookieAuthenticationEvents()
            {
                OnRedirectToLogin = (context) =>
                {
                    context.HttpContext.Response.Redirect("https://example.com/test/expired.html");
                    return Task.CompletedTask;
                }
            };
        });
        services.AddControllers();
    }

但我就是这样理解的

【问题讨论】:

    标签: c# asp.net-web-api cookie-authentication


    【解决方案1】:

    options.ExpireTimeSpan = TimeSpan.FromMinutes(120); 指示身份验证票证本身的有效期。

    控制身份验证票证在 cookie 中存储的时间 从创建之日起将保持有效到期 信息存储在受保护的 cookie 票证中。正因为如此 即使将过期的 cookie 传递给服务器,它也会被忽略 在浏览器应该清除它之后。

    这与 的值是分开的,它指定了多长时间 浏览器会保留 cookie。

    Docs

    您希望使用Cookie 属性上的Expiration 属性来控制cookie 过期时间。

    public void ConfigureServices(IServiceCollection services)
    {
    
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options => {
            options.Cookie.Name = "authToken";
            /// control cookie expiration
            options.Cookie.Expiration = TimeSpan.FromMinutes(120);
            options.ExpireTimeSpan = TimeSpan.FromMinutes(120);
            options.Events = new CookieAuthenticationEvents()
            {
                OnRedirectToLogin = (context) =>
                {
                    context.HttpContext.Response.Redirect("https://example.com/test/expired.html");
                    return Task.CompletedTask;
                }
            };
        });
        services.AddControllers();
    }
    

    或者,您也可以设置MaxAge 属性。

    【讨论】:

    • in .NET Core 3.1 Cookie.Expiration 似乎已经过时了,当我尝试设置它时,我得到了OptionsValidationException: Cookie.Expiration is ignored, use ExpireTimeSpan instead.
    • 但是该死的 MaxAge 是正确的设置,谢谢你的伙伴
    【解决方案2】:

    我在 .net core 3.1 中有一个应用程序,我的 ConfigureServices 如下所示:

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        //options.Cookie = new CookieBuilder() { Name = "EcomAuth" };
        options.LoginPath = "/Account/Login/";
        options.AccessDeniedPath = "/Account/AccessDenied";
        options.LogoutPath = "/Account/Logout";
        options.ExpireTimeSpan = TimeSpan.FromMinutes(120);
    });
    

    对于一些错误,当我设置 cookie 名称时,代码停止工作,所以这一行被注释掉了。这是我的登录操作

    List<Claim> claims = new List<Claim>
    {
        new Claim(ClaimTypes.Name, user.Name, ClaimValueTypes.String),
        new Claim(ClaimTypes.Role, userType.Name, ClaimValueTypes.String),
        new Claim("Idusuario",user.IdUser.ToString(), ClaimValueTypes.String),
    };
    
    ClaimsIdentity identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
    
    var authProperties = new AuthenticationProperties
    {
        AllowRefresh = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(120),
        IsPersistent = true,
        RedirectUri = "https://localhost:44318/Account/Logout"
    };
    
    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity), authProperties);
    

    它对我来说很好。

    【讨论】:

    • 即使删除 cookie 名称并在创建 cookie 时添加 ExpiresUtc 也没有任何改变,并且过期时间仍设置为 Session..
    【解决方案3】:

    对于我的新 ASP.NET MVC 6 项目,ExpireTimeSpan 不起作用,但 MaxAge 运行良好。

    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
    {      
        options.Cookie.MaxAge = TimeSpan.FromMinutes(120);
    })
    

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多