我试图在我的.net core 2.1应用程序中设置和理解JWT,但有一部分使我感到困惑。
我的startup.cs
中有以下设置
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.ClaimsIssuer = Configuration["Authentication:JwtIssuer"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "John",
ValidateAudience = true,
ValidAudience = "Dave",
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes
(Configuration["Authentication:JwtKey"])),
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
我特意为ValidIssuer
和ValidAudience
设置了怪异的值。
然后我的代币生成如下...
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Authentication:JwtKey"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Authentication:JwtExpireDays"]));
var token = new JwtSecurityToken(
issuer: _configuration["Authentication:JwtIssuer"],
audience: _configuration["Authentication:JwtAudience"],
claims: claims,
expires: expires,
signingCredentials: creds);
return new TokenViewModel
{
AccessToken = new JwtSecurityTokenHandler().WriteToken(token),
AccessTokenExpiration = expires,
FirstName = user.FirstName,
LastName = user.LastName
};
在这里,我将issuer
文件中的audience
和appsettings.json
设置为相应的值。
我认为我的ValidIssuer
中的ValidAudience
和startup.cs
需要与我生成的令牌中的issuer
和audience
相匹配,但这并没有。似乎是这样。如果提供了令牌,则使用[Authorize]
到端点的调用将按预期工作。
为什么它仍然起作用?难道不是要检查正确的发行者和受众详细信息吗?
编辑
我的令牌端点生成的示例令牌...
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJzdHVAcmF0Y2xpZmZlLmlvIiwianRpIjoiZWQyNmU0MjgtNjA3Yy00ZjZlLTg3ZjUtNjM1ZTU3MWQzNzQyIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiIxIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InN0dUByYXRjbGlmZmUuaW8iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbiIsImV4cCI6MTU1OTgzNDU2NiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIn0.CES0g8UCC8LArDkd8Q4s4a6mhXbkZVGiy3-hJ2Z0IqI
已解码的有效载荷如下...
{
"sub": "stu@ratcliffe.io",
"jti": "ed26e428-607c-4f6e-87f5-635e571d3742",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "1",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "stu@ratcliffe.io",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "Admin",
"exp": 1559834566,
"iss": "http://localhost:5000",
"aud": "http://localhost:5000"
}
即使我的发行人和令牌中的 http://localhost:5000 的听众与我的 John 的发行人不匹配,并且使用此令牌查询授权端点也没有问题 startup.cs
中 Dave 的受众