我正在使用Identityserver4保护我的api。
当令牌过期时,除了发送错误消息401外,如何在正文中发送带有错误说明的json对象?我正在使用.net core。
答案 0 :(得分:0)
实际上有一个有关如何执行此操作的规范:
https://tools.ietf.org/html/rfc6750#section-3
您可以在WWW-Authenticate
响应标题中提供其他信息。
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",error="invalid_token",error_description="The access token expired"
如果令牌验证通过中间件JwtBearerEvents对象失败,应该可以替换此标头。
答案 1 :(得分:0)
正如提到的其他响应一样,可以通过在未经授权的响应中设置WWW-Authenticate标头来实现。以下是API的startup.cs
上的代码以实现此目的:
services.AddAuthentication("Bearer").AddJwtBearer("Bearer",
options =>
{
options.Authority = "http://localhost:5000";
options.Audience = "api1";
options.RequireHttpsMetadata = false;
options.Events = new JwtBearerEvents()
{
OnAuthenticationFailed = OnAuthenticationFailed
};
});
}
private Task OnAuthenticationFailed(AuthenticationFailedContext context)
{
if (context.Exception is SecurityTokenExpiredException expiredException)
{
context.Response.Headers.TryAdd(HeaderNames.WWWAuthenticate,
new StringValues(new[] {
JwtBearerDefaults.AuthenticationScheme,
"error=\"invalid_token\"",
"error_description=\"The access token expired\""
}));
}
return Task.CompletedTask;
}
JWT处理程序来自Microsoft和IdentityServer,内部使用它。