c# - 在 OpenId OnRedirectToIdentityProvider 上提供自定义 401 响应消息
问题描述
我正在使用AddOpenIdConnect
并且需要修改响应以防OnRedirectToIdentityProvider
引发事件。在此事件中,响应状态被修改为 401,我想设置一条自定义消息。为了编写此自定义消息,我创建了该SetResponseBody
方法。
这个帖子的解决方案是用来设置响应状态的,但是我还需要修改Body。
我正在调用该SetResponseBody
方法(我实现的自定义方法),以便在OnRedirectToIdentityProvider
从 . 引发事件后立即修改响应正文AddOpenIdConnect
。
正如@Panagiotis Kanavos 在帖子中的评论之一所述,该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);
}
最后两行的实现如本文所述。
解决方案
推荐阅读
- c - 每当我使用扩展 ascii(unsigned char) 时,Printf 都会显示这个
- python - Heroku 芹菜工人坠毁
- html - 如何移动
- node.js - 如何通过 kubernetes 将变量传递给 Reactjs
- influxdb-2 - 在 influxdb2 上使用 CLI 配置 Scraper
- arrays - 使用 %s 格式说明符时读取访问冲突
- geolocation - 什么是组合文本/地理位置搜索的最佳方法
- c++ - DirectX 11 曲面细分着色器不工作
- python - 如何按日期对帖子进行排序(FLASK、PYTHON、SQLALCHEMY)
- algorithm - 程序员使用什么排序算法?