2012-03-20 41 views
15

Tôi muốn tạo dịch vụ đăng nhập demo trong api trên web và cần đặt cookie trên phản hồi. Làm thế nào để làm điều đó? Hoặc có cách nào tốt hơn để thực hiện ủy quyền không?Làm cách nào để đặt cookie phản hồi trên HttpReponseMessage?

+0

Có vẻ như bạn không thể đặt cookie trên HttpResponseMessage. Hãy xem chủ đề này, có lẽ nó sẽ giúp http://stackoverflow.com/questions/5463431/setting-cookies-within-a-wcf-service –

Trả lời

22

Thêm một tham chiếu đến System.Net.Http.Formatting.dll và sử dụng phương pháp AddCookies mở rộng định nghĩa trong lớp HttpResponseHeadersExtensions.

Đây là a blog post describing this approachMSDN topic.

Nếu lắp ráp đó không phải là một lựa chọn cho bạn, đây là câu trả lời cũ của tôi từ trước khi điều này là một lựa chọn:

Cũ hơn câu trả lời sau

tôi thích một cách tiếp cận mà chỉ nằm trong lĩnh vực HttpResponseMessage mà không chảy máu vào HttpContext mà không phải là đơn vị có thể kiểm tra và không luôn luôn áp dụng tùy thuộc vào máy chủ:

/// <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()); 
} 

Sau đó, bạn có thể đưa cookie vào phản hồi như thế này:

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

Tôi đồng ý, điều này trông giống như một lựa chọn tốt hơn. Đã thay đổi câu trả lời được chấp nhận để hướng dẫn người dùng trong tương lai. –

+0

Có thể đây không còn là câu trả lời nữa? Cách duy nhất tôi đã tìm thấy dll này là thông qua Nuget và nó rõ ràng nói rằng nó là dành cho WebApi.Client cao hơn 2.0 và thấp hơn 2.1, vì vậy câu trả lời này là cho WebApi 2. Chúng tôi bây giờ với ASP.NET 4 và tôi không thể tìm thấy dll này nữa. –

+0

@IsaacLlopis Tôi đoán họ đã chuyển nó từ phần mở rộng dll vào lõi. –

6

Bạn có thể thêm cookie vào bộ sưu tập HttpContext.Current.Response.Cookies.

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

Cảm ơn bạn, chính xác những gì tôi muốn và nên nghĩ đến bản thân mình. Nhưng thực sự hy vọng rằng sẽ có sẵn trên 'HttpResponseMessage'. –

+0

Đó là phỏng đoán đầu tiên của tôi, nhưng vì lý do nào đó không phải vậy. Điều đó chắc chắn sẽ tốt hơn cho khả năng kiểm tra. – Maurice

+21

Câu trả lời này đi ngược lại cách sử dụng WebAPI. Bạn không nên tham khảo HttpContext.Current từ WebAPI vì điều này sẽ không tồn tại nếu bạn tự lưu trữ. Các bit beta thiếu tải các tiện ích trợ giúp như thế này. RC đã thêm phương thức mở rộng AddCookies() vào HttpResponseMessage.Headers mà bạn nên sử dụng thay thế. – Andrew

Các vấn đề liên quan