Asp.net core 具有有效性的JWT TokenValidationParameters问题
我正在ASP.NET核心web api(.NET Core 3.1)中使用JWT,并带有Microsoft.AspNetCore.Identity。 我有以下两个项目:Asp.net core 具有有效性的JWT TokenValidationParameters问题,asp.net-core,jwt,asp.net-core-webapi,Asp.net Core,Jwt,Asp.net Core Webapi,我正在ASP.NET核心web api(.NET Core 3.1)中使用JWT,并带有Microsoft.AspNetCore.Identity。 我有以下两个项目: namespace MyProj.Identity.Controllers { [ApiController] [Route("api/authentication")] public class AuthenticationController : ControllerBase
namespace MyProj.Identity.Controllers
{
[ApiController]
[Route("api/authentication")]
public class AuthenticationController : ControllerBase
{
// ...
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginDto model)
{
// ...
foreach (var audience in _configuration.GetSection("JWT:ValidAudiences").Get<string[]>())
{
authClaims.Add(new Claim(JwtRegisteredClaimNames.Aud, audience));
}
// ...
var token = new JwtSecurityToken(
issuer: _configuration["JWT:ValidIssuer"],
expires: DateTime.Now.AddMinutes(int.Parse(_configuration["JWT:TokenExpiryMinutes"])),
claims: authClaims,
signingCredentials: new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256));
}
// ...
}
}
MyProj.Identity和MyProj.Server。
我定义了两个角色:“管理员”和“用户”。我想使用MyProj.Identity为角色为“用户”的用户生成的令牌授权对MyProj.Server控制器的调用。我还想使用MyProj.Identity为角色“admin”的用户生成的令牌来授权对MyProj.Identity的一些调用。
在MyProj.Identity中,我有以下控制器:
namespace MyProj.Identity.Controllers
{
[ApiController]
[Route("api/authentication")]
public class AuthenticationController : ControllerBase
{
//...
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginDto model)
{
//...
}
[Authorize(Roles = UserRoles.Admin)]
[HttpPost("register")]
public async Task<IActionResult> Register([FromBody] RegistrationInfo registrationInput)
{
//...
}
[Authorize(Roles = UserRoles.Admin)]
[HttpPost("register-admin")]
public async Task<IActionResult> RegisterAdmin([FromBody] RegistrationInfo registrationInput)
{
//...
}
}
}
我遇到的问题是,当我在TokenValidationParameters中设置ValidAudiences属性时,登录时生成的令牌没有任何“aud”设置(使用进行检查),因此授权失败。如果我改为设置ValidAudience属性(单个访问者),一切正常,但我不能授权多个访问者。我也尝试过从列表中手动设置“validudiences”属性(不是从config),但结果是一样的。我似乎遗漏了一些关于多重有效受众的信息。任何想法都将不胜感激。解决方案就在我面前:) MyProj.Identity中的登录方法(生成令牌)需要包括每个访问群体的身份验证声明,如下所示:
namespace MyProj.Identity.Controllers
{
[ApiController]
[Route("api/authentication")]
public class AuthenticationController : ControllerBase
{
// ...
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginDto model)
{
// ...
foreach (var audience in _configuration.GetSection("JWT:ValidAudiences").Get<string[]>())
{
authClaims.Add(new Claim(JwtRegisteredClaimNames.Aud, audience));
}
// ...
var token = new JwtSecurityToken(
issuer: _configuration["JWT:ValidIssuer"],
expires: DateTime.Now.AddMinutes(int.Parse(_configuration["JWT:TokenExpiryMinutes"])),
claims: authClaims,
signingCredentials: new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256));
}
// ...
}
}
名称空间MyProj.Identity.Controllers
{
[ApiController]
[路由(“api/认证”)]
公共类身份验证控制器:ControllerBase
{
// ...
[HttpPost(“登录”)]
公共异步任务登录([FromBody]登录到模型)
{
// ...
foreach(在_configuration.GetSection(“JWT:validudiences”).Get()中的变量访问群体)
{
Add(新声明(JwtRegisteredClaimNames.Aud,访问群体));
}
// ...
var token=新的JwtSecurityToken(
发卡机构:_配置[“JWT:ValidisUser”],
expires:DateTime.Now.AddMinutes(int.Parse(_配置[“JWT:TokenExpireyMinutes”]),
索赔:授权索赔,
signingCredentials:新的signingCredentials(authSigningKey,SecurityAlgorithms.HmacSha256));
}
// ...
}
}
这就解决了问题
"JWT": {
"ValidIssuer": "http://MyProj.Identity.Url",
"ValidAudiences": [
"http://MyProj.Identity.Url",
"http://MyProj.Server.Url"
],
"Secret": "MySecret",
"TokenExpiryMinutes": "120"
}
namespace MyProj.Identity.Controllers
{
[ApiController]
[Route("api/authentication")]
public class AuthenticationController : ControllerBase
{
// ...
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginDto model)
{
// ...
foreach (var audience in _configuration.GetSection("JWT:ValidAudiences").Get<string[]>())
{
authClaims.Add(new Claim(JwtRegisteredClaimNames.Aud, audience));
}
// ...
var token = new JwtSecurityToken(
issuer: _configuration["JWT:ValidIssuer"],
expires: DateTime.Now.AddMinutes(int.Parse(_configuration["JWT:TokenExpiryMinutes"])),
claims: authClaims,
signingCredentials: new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256));
}
// ...
}
}