C# 从Web API 2响应中删除Cookie

C# 从Web API 2响应中删除Cookie,c#,asp.net-web-api,asp.net-web-api2,C#,Asp.net Web Api,Asp.net Web Api2,我正在尝试执行一个经过身份验证的web api请求,该请求不会重置身份验证cookie超时。在MVC世界中,我将通过从响应中删除FormsAuthenticationCookie来实现这一点: Response.Cookies.Remove(System.Web.Security.FormsAuthentication.FormsCookieName); 在WebAPI2中,我编写了一个自定义IHttpActionResult,并且正在从响应中删除Set-Cookie头。但是,这并不是删除标

我正在尝试执行一个经过身份验证的web api请求,该请求不会重置身份验证cookie超时。在MVC世界中,我将通过从响应中删除FormsAuthenticationCookie来实现这一点:

 Response.Cookies.Remove(System.Web.Security.FormsAuthentication.FormsCookieName);
在WebAPI2中,我编写了一个自定义IHttpActionResult,并且正在从响应中删除Set-Cookie头。但是,这并不是删除标头,因为在为使用此操作结果的请求更新auth Cookie时,我仍然可以看到Set Cookie标头

以下是自定义IHttpActionResult:

public class NonAuthResetResult<T> : IHttpActionResult where T: class
{
    private HttpRequestMessage _request;
    private T _body;

    public NonAuthResetResult(HttpRequestMessage request, T body)
    {
        _request = request;
        _body = body;
    }

    public string Message { get; private set; }

    public HttpRequestMessage Request { get; private set; }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var msg = _request.CreateResponse(_body);
        msg.Headers.Remove("Set-Cookie");
        return Task.FromResult(msg);
    }
}
公共类NoAuthResetResult:IHttpActionResult其中T:class
{
私有HttpRequestMessage\u请求;
私人信托机构;
公共非授权重置结果(HttpRequestMessage请求,T正文)
{
_请求=请求;
_身体=身体;
}
公共字符串消息{get;private set;}
公共HttpRequestMessage请求{get;private set;}
公共任务执行同步(CancellationToken CancellationToken)
{
var msg=\u request.CreateResponse(\u body);
msg.Headers.Remove(“设置Cookie”);
返回Task.FromResult(msg);
}
}

如何在Web API 2中编辑响应头,因为这不起作用。

如果您使用的是Web API 2,那么您可能正在使用OWIN Cookie中间件。您所描述的内容听起来像是要禁用auth cookie上的滑动到期窗口

在标准Web API模板中,您应该有一个App_Start/Startup.Auth.cs。在里面你会发现这条线

app.UseCookieAuthentication(new CookieAuthenticationOptions());
这将启用和配置cookie中间件。您可以传入一些选项来更改超时窗口并禁用滑动到期

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    SlidingExpiration = false,
    ExpireTimeSpan = new TimeSpan(1, 0, 0) // 1 hour
});

Global.asax可以删除应用程序请求事件中的Cookie。您可以设置一个变量,稍后由应用程序_EndRequest提取

第一步。创建在上下文中设置变量的操作筛选器。项:

public class NoResponseCookieAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        System.Web.HttpContext.Current.Items.Add("remove-auth-cookie", "true");
    }
}
第二步。在global.asax文件中处理应用程序请求事件。如果存在步骤1中的变量,请删除cookie

protected void Application_EndRequest()
{
    if (HttpContext.Current.Items["remove-auth-cookie"] != null)
    {
        Context.Response.Cookies.Remove(System.Web.Security.FormsAuthentication.FormsCookieName);
    }
}
第三步。使用自定义筛选器装饰您的web api操作:

[NoResponseCookie]
public IHttpActionResult GetTypes()
{
    // your code here
}

我需要为一个特定的请求这样做。不是全局Web API设置。