2014-02-07 173 views
4

我正在尝试执行已验证的Web API请求,但未重置身份验证Cookie超时。在MVC世界里,我会从性反应去除FormsAuthenication饼干做到这一点:从Web API中删除Cookie 2响应

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

的Web API 2我写了一个定制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); 
    } 
} 

如何编辑在网页API 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 Middleware。您所描述的内容听起来像要禁用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 
}); 
+1

我需要为特定的要求做到这一点。不是全球Web API设置。 – LRFalk01