以下是我注册身份验证的代码
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回复。
我在这里做错了什么?
答案 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)]