2015-10-19 374 views
5

我试图从HttpResponseHeaders中删除特定的Set-Cookie标头OnActionExecuted方法ActionFilter从WebApi中删除HttpRequestHeaders中的特定cookie的方法

我有几个问题与:

  1. 我不能看到罗列头的方式。即使我在调试器中看到标题,该集合始终为空 。
  2. 因为我不能 枚举,我不能删除特定的报头。我只能用相同的密钥删除所有 头,但Set-Cookie可以有多个 条目。

目前我删除所有cookie,但是这不是我想要的。

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
{     
    HttpResponseHeaders headers = actionExecutedContext.Response.Headers; 
    IEnumerable<string> values; 
    if (headers.TryGetValues("Set-Cookie", out values)) 
    { 
     actionExecutedContext.Response.Headers.Remove("Set-Cookie"); 
    } 

    base.OnActionExecuted(actionExecutedContext); 
} 

回答

4

link

您不能直接删除用户计算机上的cookie。但是,您可以通过将Cookie的到期日期设置为过去的日期来指示用户的浏览器删除Cookie。当用户下次向设置cookie的域或路径中的页面发出请求时,浏览器将确定该cookie已过期并将其删除。

那么,如何删除/在行动过滤级别删除ASP.NET网页API的cookie,只是尽量的cookie有效期设置为一个过去的日期:

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
{ 
    var response = actionExecutedContext.Response; 
    var request = actionExecutedContext.Request; 

    var currentCookie = request.Headers.GetCookies("yourCookieName").FirstOrDefault(); 
    if (currentCookie != null) 
    { 
     var cookie = new CookieHeaderValue("yourCookieName", "") 
     { 
      Expires = DateTimeOffset.Now.AddDays(-1), 
      Domain = currentCookie.Domain, 
      Path = currentCookie.Path 
     }; 

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

    base.OnActionExecuted(actionExecutedContext); 
} 
+0

我不想删除用户计算机上的cookie。我只是不想在Web-Api中将cookie发回给用户,以防止某些web-api操作滑动到期。所以我想删除特定的Set-Cookie头。 – Marcin

+0

好吧,那么我只是好奇,为什么你要做到这一点@Marcin? –

+0

我有web app的内部使用的web应用程序。它用于简化要求,并获得返回的格式为JavaScript责任等。由于我使用窗体身份验证时,cookie是一段时间后发送,延长到期时间。我的应用程序中有几个动作会自动在后台调用。所以我想阻止它们延长Auth cookie的到期时间。 – Marcin