授权归因的控制器返回401

时间:2019-05-14 15:36:30

标签: asp.net-core jwt

我有一个.net核心api,它在进行身份验证时会生成JWT令牌,该令牌应用于带有“授权”属性的调用控制器。尽管在创建令牌后,控制器每次都会以401进行响应。

我搜索的只是基础知识的教程,我的代码与大多数指南几乎相同。

需要令牌的控制器端点;

 // GET: api/Tournaments
        [Authorize]
        [HttpGet]
        public IActionResult GetTournaments()
        {
            return Ok(_context.Tournaments.Select(t => _mapper.Map<TournamentDto>(t)));
        }

验证端点;

 [HttpPost]
        [Route("login")]
        public async Task<IActionResult> Login([FromBody] LoginModelDto model)
        {
            var user = await _authService.Login(model);
            if (user == null)
                return BadRequest();

            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new[]
                {
                    new Claim("UserID", user.UserId.ToString())
                }),
                Expires = DateTime.UtcNow.AddDays(1),
                SigningCredentials =
                    new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.JWT_Secret)),
                        SecurityAlgorithms.HmacSha256Signature)
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var securityToken = tokenHandler.CreateToken(tokenDescriptor);
            var token = tokenHandler.WriteToken(securityToken);
            return Ok(new {token});

        }

Startup.cs

var key = Encoding.UTF8.GetBytes(Configuration["ApplicationSettings:JWT_Secret"]);

            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = false;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ClockSkew = TimeSpan.Zero
                };
            });

控制器应返回比赛列表,但现在返回401。我是否缺少某些东西?我的胆量告诉我,尽管我没有要测试的想法,但是JWT令牌的创建还是有问题。

最好的问候, 弗雷德里克

1 个答案:

答案 0 :(得分:0)

我移动了

的顺序
app.UseHttpsRedirection();
app.UseMvc();
app.UseAuthentication();

app.UseAuthentication();
app.UseHttpsRedirection();
app.UseMvc();

现在一切正常。

案例已关闭。谢谢您对扎克的回答。

相关问题