首页 文章

从Web API 2响应中删除Cookie

提问于
浏览
5

我正在尝试执行经过身份验证的Web api请求,该请求不会重置身份验证Cookie超时 . 在MVC世界中,我将通过从响应中删除FormsAuthenication cookie来实现此目的:

Response.Cookies.Remove(System.Web.Security.FormsAuthentication.FormsCookieName);

在Web API 2中,我编写了一个自定义的IHttpActionResult,我从响应中删除了Set-Cookie标头 . 但是,这并没有删除 Headers ,因为在为使用此操作结果的请求更新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);
    }
}

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

2 回答

  • 7

    Global.asax可以删除Application_EndRequest事件中的cookie . 您可以设置一个变量,以便稍后由Application_EndRequest选取 .

    步骤1.创建一个动作过滤器,在Context.Items中设置变量:

    public class NoResponseCookieAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            System.Web.HttpContext.Current.Items.Add("remove-auth-cookie", "true");
        }
    }
    

    步骤2.处理global.asax文件中的Application_EndRequest事件 . 如果存在步骤1中的变量,请删除cookie .

    protected void Application_EndRequest()
    {
        if (HttpContext.Current.Items["remove-auth-cookie"] != null)
        {
            Context.Response.Cookies.Remove(System.Web.Security.FormsAuthentication.FormsCookieName);
        }
    }
    

    步骤3.使用自定义过滤器装饰您的web api操作:

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

    如果您使用的是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
    });
    

相关问题