AuthenticationTokenProvider

AuthenticationTokenProvider

我已经实现了自己的OAuthAuthorizationServerProviderAuthenticationTokenProvider,并且一切正常,但是我想发送包含更多细节的错误消息。
当刷新令牌出现问题时,我会收到以下JSON对象:{"error":"invalid_grant"}
我想要的是
{"error":"invalid_grant","reason":"here_goes_my_custom_message"}

它可以很容易地在OAuthAuthorizationServerProvider中完成(在GrantResourceOwnerCredentials方法中说),因为参数的上下文是从BaseValidatingContext继承的,因此我可以使用:

if (user == null)
{
   context.Rejected();
   context.SetError("invalid_grant", "The user name or password is incorrect.");
   return;
}


但是我不知道如何在我的AuthenticationTokenProvider中做类似的事情。我有以下方法:

public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
    {
        string hashedTokenId = Helper.GetHash(context.Token);
        OAuthRefreshToken refreshToken = _oAuthRefreshTokenService.FindRefreshToken(hashedTokenId);

        if (refreshToken != null)
        {
            //Get protectedTicket from refreshToken class
            context.DeserializeTicket(refreshToken.ProtectedTicket);
            var result = _oAuthRefreshTokenService.RemoveRefreshToken(hashedTokenId);
        }
    }


编辑:AuthenticationTokenReceiveContext不是BaseValidatingContext,因此没有SetErrorRejected方法。

当我的刷新令牌为null时,我想返回一个自定义错误消息。任何想法如何?

最佳答案

作为OP的答案可能为时已晚,但是我已经解决了这个问题,我将在此处写下答案,希望其他人能够找到它:

拒绝刷新令牌的方法是GrantRefreshToken中的OAuthAuthorizationServerProviderAuthenticationTokenProvider创建授权上下文后,将调用此方法

// this is caleld after AuthenticationTokenProvider.Receive

public override Task GrantRefreshToken(OAuthGrantRefreshTokenContext context)
{
    base.GrantRefreshToken(context);
    if (UserLocked(context.Ticket.Identity))
    {
        context.Rejected();
        context.SetError("invalid_grant", "User is locked", "usr-lockout");
    }
}

09-19 02:48