相关文章推荐
任性的风衣  ·  Amazon Live·  1 年前    · 
讲道义的柳树  ·  卓珊_百度百科·  1 年前    · 
体贴的抽屉  ·  微信键盘 macOS ...·  1 年前    · 
怕考试的椰子  ·  一盘大棋_百度百科·  1 年前    · 
public string CreateToken(UserDto input)
            var tokenHandler = new JwtSecurityTokenHandler();
            var authTime = DateTime.Now;
            var expiresAt = authTime.AddHours(_myOptions.AccessTokenTime);//到期时间
            var tokenDescriptor = new SecurityTokenDescriptor
                Subject = new ClaimsIdentity(new Claim[]
                    new Claim(JwtClaimTypes.Audience,"api"),
                    new Claim(JwtClaimTypes.Issuer,"KouBei"),
                    new Claim(JwtClaimTypes.Id, input.Id),
                    new Claim(JwtClaimTypes.PhoneNumber, input.Phone),
                    new Claim(JwtClaimTypes.NotBefore, $"{new DateTimeOffset(authTime).ToUnixTimeSeconds()}"),//token生效时间
                    new Claim(JwtClaimTypes.Expiration, $"{new DateTimeOffset(expiresAt).ToUnixTimeSeconds()}")//到期时间,按秒数计算
                }),
                IssuedAt = DateTime.Now,//token生成时间
                Expires = expiresAt,
                NotBefore = authTime,
                SigningCredentials = new SigningCredentials(symmetricKey, SecurityAlgorithms.HmacSha256Signature)//密钥和加密方式
            var token = tokenHandler.CreateToken(tokenDescriptor);
            var tokenString = tokenHandler.WriteToken(token);
            return tokenString;

二、Startup 配置

ConfigureServices方法中:

  services.AddAuthentication(x =>
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            .AddJwtBearer(o =>
                o.Events = new JwtBearerEvents()
                    OnMessageReceived = context =>
                        context.Token = context.Request.Query["AccessToken"];
                        return Task.CompletedTask;
                o.SaveToken = true;
                o.TokenValidationParameters = new TokenValidationParameters
                    NameClaimType = JwtClaimTypes.Name,
                    RoleClaimType = JwtClaimTypes.Role,
                    ValidIssuer = "KouBei",
                    ValidAudience = "api",
                    IssuerSigningKey = symmetricKey,
                    // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
                    ValidateLifetime = true,
                    //注意这是缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间,如果不配置,默认是5分钟
                    ClockSkew = TimeSpan.FromSeconds(4)
});

c# - .NetCore JwtBearerAuthentication 不拒绝过期的 token

我正在生成 JWT 以用于我的 WebApi 项目。我将 token 设置为在一分钟内过期,以便我可以测试它在过期日期之后提交时是否拒绝 token

CreateToken Controller

public async Task<IActionResult> CreateToken([FromBody] CredentialModel model)
    var user = await _unitOfWork.UserManager.FindByNameAsync(model.UserName);
    if (user == null) return BadRequest();
    if (Hasher.VerifyHashedPassword(user, user.PasswordHash, model.Password) != PasswordVerificationResult.Success) return BadRequest();
    var userClaims = await UserManager.GetClaimsAsync(user);
    var claims = new[]
        new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
        new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()),
        new Claim(JwtRegisteredClaimNames.GivenName, user.FirstName), 
        new Claim(JwtRegisteredClaimNames.FamilyName, user.LastName),
        new Claim(JwtRegisteredClaimNames.Email, user.Email)
    .Union(userClaims);
    var cert = new Certificate(Configuration["Tokens:Certificate"]);
    var token = new JwtSecurityToken(
        issuer: Configuration["Tokens:Issuer"],
        audience: Configuration["Tokens:Audience"],
        claims: claims,
        expires: DateTime.UtcNow.AddMinutes(1),
        signingCredentials: cert.Signature
    return Ok(new
        token = new JwtSecurityTokenHandler().WriteToken(token),
        expiration = token.ValidTo
    });

token 认证-启动类

app.UseJwtBearerAuthentication(new JwtBearerOptions()
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    TokenValidationParameters = new TokenValidationParameters()
        ValidIssuer = Configuration["Tokens:Issuer"],
        ValidAudience = Configuration["Tokens:Audience"],
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new Certificate(Configuration["Tokens:Certificate"]).SecurityKey,
        ValidateLifetime = true
});

尽管我设置了 validateLifetime = true ,但两分钟后 token 不会被拒绝。它将继续接受 token 。是否有我不知道的最短到期时间或我的设置错误?

ClockSkew 的默认值为 5 分钟。

app.UseJwtBearerAuthentication(new JwtBearerOptions()
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    TokenValidationParameters = new TokenValidationParameters()
        ValidIssuer = Configuration["Tokens:Issuer"],
        ValidAudience = Configuration["Tokens:Audience"],
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new Certificate(certPath: Configuration["Tokens:Certificate"], isValid: false).SecurityKey,
        ValidateLifetime = true,
        ValidateIssuer = true,
        ValidateAudience = true,
        ClockSkew = TimeSpan.Zero
});
                    设置为在一分钟内过期,以便我可以测试它在过期日期之后提交时是否拒绝。我正在生成 JWT 以用于我的 WebApi 项目。是否有我不知道的最短到期时间或我的设置错误?的默认值为 5 分钟。
				
JWT 讲解 与 token 过期自动续期解决方案1.什么是token2.什么是JWT3.token过期自动续费方案3.1 token过期3.2 解决方案 1.什么是token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。 使用tok
ASP.NET Core Web API采用Token进行身份验证。 主要技术:ASP.NET Core Web API , JWT , Json web token 包括获取TokenToken验证,生成Token等内容 具体可参考个人文章【ASP.NET Core Web API之Token验证】
在文中给出的例子中,仅实现了登录认证,但是并没有设置token过期时间,在实际应用中,token一般都需要设置过期时间。 如何设置token过期时间 前文《Java面试常见问题:JWT是什么?》介绍过,JWT token的payload部分是一个json串,是要传递数据的一组声明,这些声明被JWT标准称为claims。 JWT标准里面定义的标准claim包括: iss(Issuser):JWT的签发主体; sub(Subject):JWT的所有者; aud(Audience):JWT的接..
快速开发(基础功能全部由代码生成器生成) 支持前端,后台自定义业务代码扩展,后台提供常规通用扩展与通用类 前端,后台提供了近300个扩展方法与属性,开发人员可在此功能上编写扩展自定义业务代码 代码生成(代码生成器可直接生成主/从表前预期业务代码,有30种属性可在线配置生成的代码) 前端表格自动转换键/值 前端表单select / checkbox自动绑定数据源,不需要写任何代码 支持(主从表)一对一前代码自动生成,并支持数据源自动绑定与业务代码扩展,不需要写任何代码 支持一对多从表自定义扩展(不限 由于jwt中的token过期时间是打包在token中的,用户登录以后发送给客户端以后token不能变化,那么要在用户无感知的情况下刷新token,就要在符合过期条件的情况下,在缓存一个新的token,作为续命token,再次解析不要解析客户端发送的token,要解析自己缓存的续命token 主要逻辑: 如果当前token没有超过过期时间的两倍,续期,超过了重新登录 主要代码如下: package com.hongseng.app.config.jwtfilter; import enums.Tok 我尝试设置15秒时效,发现等了几分钟也没失效 需要覆盖默认值ClockSkew改成0 就能立马测试出来了。 options.TokenValidationParameters = new TokenValidationParameters //NameClaimType = JwtClaimTypes.Name,