gpt4 book ai didi

c# - C#中JwtTokens的正确使用

转载 作者:太空狗 更新时间:2023-10-29 17:29:42 24 4
gpt4 key购买 nike

我正在玩 JwtTokens,但无法使它们正常工作。我正在使用 http://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/为了它。我知道代码很乱,但只是为了展示我正在尝试做的事情。问题是我希望 JwtTokenHandler 由于生命周期而无法通过验证。

var key = "5A0AB091-3F84-4EC4-B227-0834FCD8B1B4";
var domain = "http://localhost";
var allowedAudience = "http://localhost";
var signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256";
var digestAlgorithm = "http://www.w3.org/2001/04/xmlenc#sha256";
var issuer = "self";
var securityKey = System.Text.Encoding.Unicode.GetBytes(key);
var inMemorySymmetricSecurityKey = new InMemorySymmetricSecurityKey(securityKey);

var now = DateTime.UtcNow;
var expiry = now.AddSeconds(1);
var tokenHandler = new JwtSecurityTokenHandler();
var claimsList = new List<Claim>()
{
new Claim(ClaimTypes.Name, "user"),
new Claim(ClaimTypes.Webpage, allowedAudience),
new Claim(ClaimTypes.Uri, domain),
new Claim(ClaimTypes.Expiration,expiry.Ticks.ToString())
};
var roles = new List<string>() { "admin" };
claimsList.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));

var identity = new GenericIdentity("user");

var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(identity, claimsList),
TokenIssuerName = issuer,
AppliesToAddress = allowedAudience,
Lifetime = new Lifetime(now, expiry),
SigningCredentials = new SigningCredentials(inMemorySymmetricSecurityKey, signatureAlgorithm, digestAlgorithm),
};

var token = tokenHandler.WriteToken(tokenHandler.CreateToken(tokenDescriptor));

var validationParameters = new TokenValidationParameters()
{
ValidIssuer = issuer,
ValidAudience = allowedAudience,
IssuerSigningToken = new BinarySecretSecurityToken(securityKey)
};

Thread.Sleep(2000);
try
{
SecurityToken securityToken;
tokenHandler.ValidateToken(token, validationParameters, out securityToken);
Console.WriteLine("OK");
}
catch (Exception e)
{
Console.WriteLine("Error {0}", e.Message);
}

因为我等了 2 秒,这不会失败吗?如果我将 ValidationTokenParameter 的颁发者更改为“x”,它将失败...

最佳答案

发现问题。验证参数的默认时钟偏差为 5 分钟

/// <summary>
/// Default for the clock skew.
///
/// </summary>
///
/// <remarks>
/// 300 seconds (5 minutes).
/// </remarks>
public static readonly TimeSpan DefaultClockSkew;

将其设置为 0 可使此工作正常进行。还是不明白为什么偏斜是 5 分钟,如果我在某个时间点设置过期!!!

关于c# - C#中JwtTokens的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29445863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com