1

我需要更改我的 web.api 生成的所有 cookie 上的 HttpOnly 和 Secure 标志。

为此,我添加了一个全局过滤器,它修改来自我的 web.api 的每个响应。我已经有代码在 IIS 中使用 PreSendRequestHeaders 事件执行此操作,但这在自托管时不起作用。

我需要更改的 cookie 是会话和表单身份验证 cookie。httponly 标志不是主要问题,安全标志是我们进行 SSL 卸载时的问题,因此它没有自动设置为安全。

我可以使用 HttpResponseHeadersExtensions 添加 cookie,但我看不到任何更新现有 cookie 的内容。

我想避免手动解析 set-cookie 标头。实现这一目标的最佳方法是什么?

(这需要在自己的主机和IIS中工作,所以不能使用HttpContext.Current)

4

1 回答 1

1

假设 cookie 是由 ApiController 本身设置的。它可以是任何组件,但说控制器会这样做,如下所示:

public HttpResponseMessage Get(int id)
{
    var cookie = new CookieHeaderValue("abc", "12345");
    cookie.Path = "/";

    var response = Request.CreateResponse();
    response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    return response;
}

同样,cookie 可以是任何 cookie,包括 FormsAuth。但我只是使用普通的cookie。如果您有消息处理程序,您可以简单地创建一个具有相同密钥的 HttpOnly 和安全 cookie,如下所示:

public class MyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
                                    HttpRequestMessage request,
                                          CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        var cookie = new CookieHeaderValue("abc", "12345");
        cookie.Secure = true;
        cookie.HttpOnly = true;
        cookie.Path = "/";

        response.Headers.AddCookies(new CookieHeaderValue[] { cookie });

        return response;
    }
}

这样发送回客户端的 cookie 将是一个安全的 HttpOnly cookie。

于 2013-05-14T17:40:52.850 回答