【发布时间】: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