IdentityServer发送未经授权的401消息时如何添加error_response

时间:2020-07-15 16:46:24

标签: identityserver4

我正在使用Identityserver4保护我的api。

当令牌过期时,除了发送错误消息401外,如何在正文中发送带有错误说明的json对象?我正在使用.net core。

2 个答案:

答案 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,内部使用它。