我已经实现了自己的OAuthAuthorizationServerProvider
和AuthenticationTokenProvider
,并且一切正常,但是我想发送包含更多细节的错误消息。
当刷新令牌出现问题时,我会收到以下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
,因此没有SetError
或Rejected
方法。当我的刷新令牌为
null
时,我想返回一个自定义错误消息。任何想法如何? 最佳答案
作为OP的答案可能为时已晚,但是我已经解决了这个问题,我将在此处写下答案,希望其他人能够找到它:
拒绝刷新令牌的方法是GrantRefreshToken
中的OAuthAuthorizationServerProvider
。 AuthenticationTokenProvider
创建授权上下文后,将调用此方法
// 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");
}
}