2014-02-07 213 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