Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 具有有效性的JWT TokenValidationParameters问题_Asp.net Core_Jwt_Asp.net Core Webapi - Fatal编程技术网

Asp.net core 具有有效性的JWT TokenValidationParameters问题

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

我正在ASP.NET核心web api(.NET Core 3.1)中使用JWT,并带有Microsoft.AspNetCore.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.IdentityMyProj.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));
        }
        // ...
    }
}