【问题标题】:AddJwtBearer validates token but kills requestAddJwtBearer 验证令牌但终止请求
【发布时间】:2018-07-31 13:53:02
【问题描述】:

以下是我注册身份验证的代码

var tokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = signingKey,

                ValidateIssuer = true,
                ValidIssuer = issuer,

                ValidateAudience = true,
                ValidAudience = audience,

                ValidateLifetime = true,

                ClockSkew = TimeSpan.Zero
            };

    services.AddAuthentication(options =>
                {
                    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                })
               .AddJwtBearer(options =>
               {
                   options.TokenValidationParameters = tokenValidationParameters;
                   options.Events = new JwtBearerEvents
                   {
                       OnAuthenticationFailed = context =>
                       {
                           Console.WriteLine("OnAuthenticationFailed: " + context.Exception.Message);
                           Trace.WriteLine("OnAuthenticationFailed: " + context.Exception.Message);


                           return Task.CompletedTask;
                       },
                       OnTokenValidated = context =>
                       {
                           Console.WriteLine("OnTokenValidated: " + context.SecurityToken);
                           Trace.WriteLine("OnTokenValidated: " + context.SecurityToken);
                           return Task.CompletedTask;
                       }
                   };
               });

以下是我的控制器代码

 [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        // GET api/values
        [HttpGet]
        [Authorize]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }

但是我对 api/values 的请求永远不会到达这个控制器。

请求以某种方式在 OnTokenValidated 事件中完成。

我收到 401 响应。

我在这里做错了什么?

【问题讨论】:

  • 你试过在OnTokenValidated调试吗?
  • 是的。我确实调试了 OnTokenValidated 事件。一旦它返回 Task.CompletedTask,请求就结束了。
  • 您在调试时检查了context 参数吗?您可能会发现令牌验证已经失败,您应该能够看到它的原因。
  • 我看到 ((System.Security.Claims.ClaimsIdentity)context.HttpContext.User.Identity).IsAuthenticated 设置为 false。但我在任何地方都看不到失败的原因。我在哪里可以找到?

标签: asp.net-web-api asp.net-core jwt


【解决方案1】:

据我了解,在使用 Identity 时,defaultAuthenticateScheme 设置为 cookie 身份验证。 我不确定options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 应该做什么,但当我在使用 JWT 身份验证的程序中测试它时,它并没有更改 DefaultAuthenticateScheme 或 DefaultChallengeScheme。

尝试添加

options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;

然后在未授权添加时防止得到 404 而不是 401

options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

如果您想通过 JWT 使用 cookie 身份验证,您可以在 [Authorize] 标记中设置 DefaultAuthenticatieScheme,如下所示:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

【讨论】:

  • 没用。结果相同。 ((System.Security.Claims.ClaimsIdentity)context.HttpContext.User.Identity).IsAuthenticated 设置为 false。
猜你喜欢
  • 2013-04-11
  • 2019-01-11
  • 1970-01-01
  • 2018-08-07
  • 2021-09-17
  • 2020-11-09
  • 2013-10-06
  • 2014-10-08
  • 2019-09-16
相关资源
最近更新 更多