在 OpenId OnRedirectToIdentityProvider 上提供自定义 401 响应消息

时间:2021-04-02 14:21:52

标签: c# .net-core openid-connect openid

我正在使用 AddOpenIdConnect 并且需要修改响应以防引发 OnRedirectToIdentityProvider 事件。在此事件中,响应状态修改为 401,我想设置自定义消息。为了编写此自定义消息,我创建了 SetResponseBody 方法。

this post的解决方案是用来设置响应状态的,但是我也需要修改Body。

我正在调用 SetResponseBody 方法(我实现的自定义方法),以便在从 OnRedirectToIdentityProvider 引发 AddOpenIdConnect 事件时立即修改响应正文。'< /p>

正如@Panagiotis Kanavos 在 post 中的评论之一所述,SetResponseBody 方法似乎不是正确的解决方案(尽管响应实际上包含有效的 json)。你能提供一个替代方案吗?

总结:除了状态码 401 之外,我还想返回一个自定义响应。

OnRedirectToIdentityProvider = async e =>
{
    // e is of type RedirectContext
    if (e.Request.Path.StartsWithSegments("/api")))
    {            
        if (e.Response.StatusCode == (int)HttpStatusCode.OK)
        {
            e.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            // TestMessage is a const
            // e.Response is readonly (get) so it's not possible to set it directly.
            await ResponseRewriter.SetResponseBody(e.Response, TestMessage);
        }
        e.HandleResponse();
    }
    await Task.CompletedTask;
}

ResponseRewriter.SetResponseBody 定义如下

public static async Task SetResponseBody(HttpResponse response, string message)
{   
    var originalResponseBody = response.Body;
    var responseBody = new MemoryStream();
    response.Body = responseBody;
    response.ContentType = "application/json";
    var body = new { Message = message };
    string json = JsonSerializer.Serialize(body);
    await response.WriteAsync(json);
    response.Body.Seek(0, SeekOrigin.Begin);
    await responseBody.CopyToAsync(originalResponseBody);         
}

最后两行按照 this post 中的写法实现。

0 个答案:

没有答案