没有 Exp 和默认道具的 dotnet 中的 Jwt 令牌
Jwt token in dotnet with no Exp and default props
我正在使用 .Net core 3.1 创建一个身份 api 我注册并让我的用户登录,并且我需要传递一个 JWT 令牌供前端使用。
我已经用我需要的声明生成了我的令牌,但我需要令牌永不过期(我知道这不是一个好的做法,但我只是在遵守命令),而且我还需要删除令牌的默认属性比如 nbf 和 iat.
我正在使用库 Microsoft.AspNetCore.Authentication.JwtBearer
我在文档中没有找到太多,所以我什至不知道是否可能
您是否尝试过在 TokenValidationParameters
中将 ValidateLifetime
设置为 false
?这将允许任何到期日期。
您可以做的另一件事是将 RequireExpirationTime
设置为 false
,这意味着 exp
不需要出现在令牌中。
因此,如果您想将其配置为允许令牌不包含过期时间,但如果存在 exp
属性 仍然验证过期时间,您可以这样做:
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateLifetime = true,
RequireExpirationTime = false,
};
});
此外,如果需要,您可以在同一位置设置自定义生命周期验证器:
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// ... Other settings
LifetimeValidator = (notBefore, expiration, token, parameters) =>
{
// Decide if expiration is valid. Don't forget about clock skew.
}
};
});
尽管不清楚您是否可以控制令牌发行者、令牌消费者或两者。以上所有解决方案都假定您可以控制令牌消费者。
如果你只控制发行人,那就有点困难了。我想到的是设定一个非常遥远的未来的 exp
日期。如果以后需要使令牌无效,我想你可以做的一件事是将发行者和消费者使用的加密密钥更改为 create/validate 签名。
在发行方删除 exp、iat 和 nbf
至于从令牌中删除属性,您可以将它们从令牌生成中保留下来。假设您正在进行手动令牌生成,您需要配置它,例如像这样:
var tokenOptions = new JwtSecurityToken(
issuer: jwtIssuer,
audience: jwtAudience,
claims: new List<Claim>() {
new Claim(JwtRegisteredClaimNames.Sub, userName),
},
// 'expires' not set
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Convert.FromBase64String(someKey)), SecurityAlgorithms.HmacSha256)
);
以这种方式生成它不会包含 exp、iat 或 nbf(本地确认)。
当然,如果您碰巧通过例如生成它Identity Server,这是一个不同的故事,但是你忘了提到那个(你提到了 Identity,它是一个没有内置 JWT 令牌生成功能的会员系统)。
我正在使用 .Net core 3.1 创建一个身份 api 我注册并让我的用户登录,并且我需要传递一个 JWT 令牌供前端使用。
我已经用我需要的声明生成了我的令牌,但我需要令牌永不过期(我知道这不是一个好的做法,但我只是在遵守命令),而且我还需要删除令牌的默认属性比如 nbf 和 iat.
我正在使用库 Microsoft.AspNetCore.Authentication.JwtBearer 我在文档中没有找到太多,所以我什至不知道是否可能
您是否尝试过在 TokenValidationParameters
中将 ValidateLifetime
设置为 false
?这将允许任何到期日期。
您可以做的另一件事是将 RequireExpirationTime
设置为 false
,这意味着 exp
不需要出现在令牌中。
因此,如果您想将其配置为允许令牌不包含过期时间,但如果存在 exp
属性 仍然验证过期时间,您可以这样做:
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateLifetime = true,
RequireExpirationTime = false,
};
});
此外,如果需要,您可以在同一位置设置自定义生命周期验证器:
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// ... Other settings
LifetimeValidator = (notBefore, expiration, token, parameters) =>
{
// Decide if expiration is valid. Don't forget about clock skew.
}
};
});
尽管不清楚您是否可以控制令牌发行者、令牌消费者或两者。以上所有解决方案都假定您可以控制令牌消费者。
如果你只控制发行人,那就有点困难了。我想到的是设定一个非常遥远的未来的 exp
日期。如果以后需要使令牌无效,我想你可以做的一件事是将发行者和消费者使用的加密密钥更改为 create/validate 签名。
在发行方删除 exp、iat 和 nbf
至于从令牌中删除属性,您可以将它们从令牌生成中保留下来。假设您正在进行手动令牌生成,您需要配置它,例如像这样:
var tokenOptions = new JwtSecurityToken(
issuer: jwtIssuer,
audience: jwtAudience,
claims: new List<Claim>() {
new Claim(JwtRegisteredClaimNames.Sub, userName),
},
// 'expires' not set
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Convert.FromBase64String(someKey)), SecurityAlgorithms.HmacSha256)
);
以这种方式生成它不会包含 exp、iat 或 nbf(本地确认)。
当然,如果您碰巧通过例如生成它Identity Server,这是一个不同的故事,但是你忘了提到那个(你提到了 Identity,它是一个没有内置 JWT 令牌生成功能的会员系统)。