2012-03-20 3 views
15

Vorrei creare un servizio di accesso demo in web api e ho bisogno di impostare un cookie sulla risposta. Come lo faccio? O c'è un modo migliore per fare l'autorizzazione?Come si imposta un cookie di risposta su HttpReponseMessage?

+0

Non sembra possibile impostare un cookie su HttpResponseMessage. Dai un'occhiata a questo thread, forse aiuterà http://stackoverflow.com/questions/5463431/setting-cookies-within-a-wcf-service –

risposta

22

Aggiungere un riferimento alla System.Net.Http.Formatting.dll e utilizzare il metodo AddCookies estensione definito nella classe HttpResponseHeadersExtensions.

Qui è a blog post describing this approach e MSDN topic.

Se quell'assemblea non è un'opzione per voi, ecco la mia risposta Più da prima che questo era un'opzione:

più vecchio risposta segue

Io preferisco un approccio che rimane nel regno della HttpResponseMessage senza sanguinamento nel HttpContext che non è così unità testabili e non sempre si applica a seconda dell'ospite:

/// <summary> 
/// Adds a Set-Cookie HTTP header for the specified cookie. 
/// WARNING: support for cookie properties is currently VERY LIMITED. 
/// </summary> 
internal static void SetCookie(this HttpResponseHeaders headers, Cookie cookie) { 
    Requires.NotNull(headers, "headers"); 
    Requires.NotNull(cookie, "cookie"); 

    var cookieBuilder = new StringBuilder(HttpUtility.UrlEncode(cookie.Name) + "=" + HttpUtility.UrlEncode(cookie.Value)); 
    if (cookie.HttpOnly) { 
     cookieBuilder.Append("; HttpOnly"); 
    } 

    if (cookie.Secure) { 
     cookieBuilder.Append("; Secure"); 
    } 

    headers.Add("Set-Cookie", cookieBuilder.ToString()); 
} 

Quindi è possibile includere un cookie nella risposta In questo modo:

HttpResponseMessage response; 
response.Headers.SetCookie(new Cookie("name", "value")); 
+0

Sono d'accordo, questo sembra un'alternativa migliore. Modificate le risposte accettate per guidare gli utenti in futuro. –

+0

È possibile che questa non sia più una risposta? L'unico modo in cui ho trovato questa dll è tramite Nuget e afferma esplicitamente che è per WebApi.Client superiore a 2.0 e inferiore a 2.1, quindi questa risposta era per WebApi 2. Ora siamo con ASP.NET 4 e I non riesci a trovare più questa DLL –

+0

@IsaacLlopis Suppongo che l'abbiano spostato dall'estensione dll al core. –

6

È possibile aggiungere il cookie alla raccolta HttpContext.Current.Response.Cookies.

var cookie = new HttpCookie("MyCookie", DateTime.Now.ToLongTimeString()); 
    HttpContext.Current.Response.Cookies.Add(cookie); 
+0

Grazie, esattamente quello che volevo e avrei dovuto pensare a me stesso. Ma in realtà ci si aspettava che fosse disponibile su "HttpResponseMessage". –

+0

Questa è stata la mia prima ipotesi, ma per qualche motivo non lo è. Certamente sarebbe stato meglio per la capacità di test. – Maurice

+21

Questa risposta va contro il modo in cui WebAPI dovrebbe essere utilizzato. Non si dovrebbe fare riferimento a HttpContext.Current da WebAPI poiché questo non esiste se si esegue l'hosting automatico. I beta bit mancavano di un sacco di utility helper come questa. Il RC ha aggiunto un metodo di estensione AddCookies() a HttpResponseMessage.Headers che dovresti invece usare. – Andrew