AddJwtBearer验证令牌但终止请求

时间:2018-02-21 04:30:16

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

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

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回复。

我在这里做错了什么?

1 个答案:

答案 0 :(得分: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)]