首页 新闻 会员 周边 捐助

如何在 ASP.NET Core 的 Middleware 中读取 Response Body

0
悬赏园豆:30 [已解决问题] 解决于 2025-04-10 22:40

想实现在 asp.net core 中间件中读取 /connect/userinfo 的响应内容,根据响应内容检查用户信息,如果不是期望的目标用户,响应 403

请求如何在 await next(context); 之后读取 Response.Body 的内容?

dudu的主页 dudu | 高人七级 | 园豆:24807
提问于:2025-04-09 17:59
< >
分享
最佳答案
0

参考 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;
        }
    }
}
dudu | 高人七级 |园豆:24807 | 2025-04-09 21:26
其他回答(1)
0

有个AuthorizationHandler 实现即可

Wenlyson | 园豆:190 (初学一级) | 2025-04-24 23:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册