首页 > 解决方案 > 如何自定义 OpenIddict 产生的授权错误?

问题描述

我在 .NET Core 2 API 中使用 OpenIddict 进行身份验证。客户端我依靠任何 API 错误来遵循自定义方案。但是,当刷新令牌已经过时时,我似乎不知道如何自定义发回的错误。

永远不会到达/token端点,因此错误不在“我的控制”之下。

请求的结果是状态码 400,带有以下 JSON:

{"error":"invalid_grant","error_description":"The specified refresh token is no longer valid."}

我尝试使用自定义中间件来捕获所有状态代码(它确实如此),但在我的自定义中间件执行完成之前返回结果。

如何正确自定义错误或拦截以更改它?谢谢!

标签: asp.net-coreopeniddict

解决方案


您可以使用 OpenIddict 的事件模型在将令牌响应负载写入响应流之前对其进行自定义。这是一个例子:

MyApplyTokenResponseHandler.cs

public class MyApplyTokenResponseHandler : IOpenIddictServerEventHandler<ApplyTokenResponseContext>
{
    public ValueTask HandleAsync(ApplyTokenResponseContext context)
    {
        var response = context.Response;
        if (string.Equals(response.Error, OpenIddictConstants.Errors.InvalidGrant, StringComparison.Ordinal) &&
           !string.IsNullOrEmpty(response.ErrorDescription))
        {
            response.ErrorDescription = "Your customized error";
        }

        return default;
    }
}

启动.cs

services.AddOpenIddict()
    .AddCore(options =>
    {
        // ...
    })

    .AddServer(options =>
    {
        // ...
        options.AddEventHandler<ApplyTokenResponseContext>(builder =>
            builder.UseSingletonHandler<MyApplyTokenResponseHandler>());
    })

    .AddValidation();

推荐阅读