C# OAuth OWIN:当提供给令牌终结点的凭据无效时返回自定义响应

本文关键字:无效 响应 自定义 返回 结点 OWIN OAuth 令牌 | 更新日期: 2023-09-27 17:56:01

我有一个通过OAuthAuthorizationServerProvider实现身份验证的Web API项目。我已经对提供程序进行了子类化,并根据需要实现了实现我自己的身份验证系统的方法。

我还想出了如何覆盖为未经身份验证的请求提供的返回值(您必须对AuthorizeAttribute类进行子类化,然后在要保护的端点上使用自定义属性而不是Authorize)。

我还可以重写 OAuth 身份验证服务器提供程序中的 TokenResponse 方法,以更改包含令牌的响应。

现在,我尝试做的是在用户向令牌终结点提供不正确的凭据时覆盖令牌终结点提供的响应。现在,我只是得到这个:

{"error":"invalid_grant","error_description":"The user name or password is incorrect."}

我知道此文本来自何处 - 在我的GrantResourceOwnerCredentials方法中,如果请求未经过身份验证,我会执行以下操作:

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

相反,我希望能够完全操作用户提供不正确凭据时返回的Response对象。

例如,我可能希望将返回设置为如下所示:

{"error":401,"timestamp":1234567890,"message":"Those credentials are wrong. Try again."}

有没有办法覆盖服务器在身份验证失败时提供的响应?

C# OAuth OWIN:当提供给令牌终结点的凭据无效时返回自定义响应

您无法更改此行为。您只能更改context.SetError()方法中的字段。

在这种情况下,响应(包括状态代码)由SendErrorAsJsonAsync()私有方法组成,位于内部类OAuthAuthorizationServerHandler Microsoft.Owin.Security.OAuth dll中。

您可以在类OAuthAuthorizationServerHandler修改代码以获取更多详细信息。

尝试下面的代码,参考这里

public class CustomAccessTokenProvider : AuthenticationTokenProvider
{
    public override void Receive(AuthenticationTokenReceiveContext context)
    {
        context.DeserializeTicket(context.Token);
        var expired = context.Ticket.Properties.ExpiresUtc < DateTime.UtcNow;
        if (expired)
        {
            //If current token is expired, set a custom response header
            context.Response.Headers.Add("X-AccessTokenExpired", new string[] { "1" });
        }
        base.Receive(context);
    }
}

在设置 OWIN OAuth 时注册它:

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
            {
                AccessTokenProvider = new CustomAccessTokenProvider()
            });