想实现在 asp.net core 中间件中读取 /connect/userinfo
的响应内容,根据响应内容检查用户信息,如果不是期望的目标用户,响应 403
请求如何在 await next(context);
之后读取 Response.Body 的内容?
参考 deepseek 的回答通过下面的代码实现了
public class UserInfoMiddleware(RequestDelegate next, IRoleService roleService)
{
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Path.Equals("/connect/userinfo"))
{
await ProcessUserInfoAsync(context);
}
else
{
await next(context);
}
}
private async Task ProcessUserInfoAsync(HttpContext context)
{
var originalBodyStream = context.Response.Body;
using var memoryStream = new MemoryStream();
context.Response.Body = memoryStream;
await next(context);
memoryStream.Seek(0, SeekOrigin.Begin);
var responseBody = await new StreamReader(memoryStream).ReadToEndAsync();
memoryStream.Seek(0, SeekOrigin.Begin);
if (await CheckUser(responseBody) == false)
{
context.Response.Body = originalBodyStream;
context.Response.StatusCode = 403;
context.Response.ContentType = "text/plain";
var responseText = "当前账号没有权限";
context.Response.ContentLength = Encoding.UTF8.GetByteCount(responseText);
await context.Response.WriteAsync(responseText);
return;
}
else
{
await memoryStream.CopyToAsync(originalBodyStream);
context.Response.Body = originalBodyStream;
}
}
}
有个AuthorizationHandler 实现即可