如何在asp.net web api中的cookie上设置安全标志

时间:2013-05-14 10:43:30

标签: asp.net-web-api

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

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

我需要更改的Cookie是会话并形成身份验证Cookie。 httponly标志不是主要问题,它是我们进行SSL卸载时出现问题的安全标志,因此它未设置为自动保护。

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

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

(这需要在自主机和IIS中工作,因此无法使用HttpContext.Current)

1 个答案:

答案 0 :(得分: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。