namespace Dpz.Core.Web.Library.Middleware;

/// <summary>
/// 处理HTTP响应中间件
/// </summary>
public class HttpResponseHeaderHandel
{
    private readonly RequestDelegate _next;

    /// <summary>
    ///
    /// </summary>
    /// <param name="next"></param>
    public HttpResponseHeaderHandel(RequestDelegate next)
    {
        _next = next;
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="httpContext"></param>
    /// <returns></returns>
    public async Task Invoke(HttpContext httpContext)
    {
        /*
         * from https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers
         * 列出哪些 http response headers 对外暴露
         * 这里设置为所有
         */
        httpContext.Response.Headers.Append("Access-Control-Expose-Headers", "*");

        var sessionId = httpContext.Request.Cookies[Program.AuthorizeCookieName + ".SessionId"];

        if (string.IsNullOrWhiteSpace(sessionId))
        {
            httpContext.Response.Cookies.Append(
                Program.AuthorizeCookieName + ".SessionId",
                Guid.NewGuid().ToString("N"),
                new CookieOptions
                {
                    HttpOnly = true,
                    Secure = true,
                    SameSite = SameSiteMode.Strict,
                    IsEssential = true,
                    Expires = DateTimeOffset.Now.AddYears(1),
                }
            );
        }
        await _next.Invoke(httpContext);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

HTTP响应头处理中间件分析

这段代码是一个ASP.NET Core中间件,名为HttpResponseHeaderHandel,主要功能是处理HTTP响应头和一些会话相关的操作。以下是它的主要功能:

1. CORS相关头设置

httpContext.Response.Headers.Append("Access-Control-Expose-Headers", "*");

这行代码设置了Access-Control-Expose-Headers响应头为*,表示允许客户端访问所有的响应头。这在跨域请求(CORS)时很重要,默认情况下浏览器只能访问简单的响应头。

2. 会话ID管理

var sessionId = httpContext.Request.Cookies[Program.AuthorizeCookieName + ".SessionId"];

if (string.IsNullOrWhiteSpace(sessionId))
{
    httpContext.Response.Cookies.Append(
        Program.AuthorizeCookieName + ".SessionId",
        Guid.NewGuid().ToString("N"),
        new CookieOptions
        {
            HttpOnly = true,
            Secure = true,
            SameSite = SameSiteMode.Strict,
            IsEssential = true,
            Expires = DateTimeOffset.Now.AddYears(1),
        }
    );
}

这部分代码检查请求中是否包含名为[Program.AuthorizeCookieName].SessionId的cookie:

  • 如果没有找到,则创建一个新的GUID作为会话ID,并设置为cookie
  • cookie设置了安全属性:
    • HttpOnly: 防止JavaScript访问
    • Secure: 只通过HTTPS传输
    • SameSite=Strict: 严格的同站策略
    • IsEssential: 标记为必要cookie
    • 有效期1年

3. 请求管道继续

await _next.Invoke(httpContext);

最后调用下一个中间件,继续处理管道中的请求。

总结

这个中间件主要做了两件事:

  1. 设置CORS相关响应头,允许客户端访问所有响应头
  2. 管理会话ID,确保每个客户端都有一个持久化的会话标识符

这种中间件通常用于需要跨域支持和会话管理的Web应用中。

评论加载中...