我需要更改我的web.api生成的所有Cookie上的HttpOnly和Secure标志。
为此,我添加了一个全局过滤器,用于修改web.api的每个响应。我已经有了使用PreSendRequestHeaders事件在IIS中执行此操作的代码,但这在自托管时不起作用。
我需要更改的Cookie是会话并形成身份验证Cookie。 httponly标志不是主要问题,它是我们进行SSL卸载时出现问题的安全标志,因此它未设置为自动保护。
我可以使用HttpResponseHeadersExtensions添加Cookie,但我看不到更新现有Cookie的任何内容。
我想避免手动解析set-cookie标头。实现这一目标的最佳途径是什么?
(这需要在自主机和IIS中工作,因此无法使用HttpContext.Current)
答案 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。