问题描述
我正在使用 AddOpenIdConnect
并且需要修改响应以防引发 OnRedirectToIdentityProvider
事件。在此事件中,响应状态修改为 401,我想设置自定义消息。为了编写此自定义消息,我创建了 SetResponseBody
方法。
this post的解决方案是用来设置响应状态的,但是我也需要修改Body。
我正在调用 SetResponseBody
方法(我实现的自定义方法),以便在从 OnRedirectToIdentityProvider
引发 AddOpenIdConnect
事件时立即修改响应正文。'
正如@Panagiotis Kanavos 在 post 中的评论之一所述,SetResponseBody
方法似乎不是正确的解决方案(尽管响应实际上包含有效的 json)。你能提供一个替代方案吗?
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 中的写法实现。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)