2015-02-18 15 views
6

Tôi đang cố gắng đặt cookie trong ứng dụng của mình.cookie cục bộ không được đặt

Dưới đây là đoạn code để đặt cookie:

public HttpResponseMessage LogIn(UserLoginVM user) 
{ 
    // Do login stuff 

    var cookie = new CookieHeaderValue("STUPID-COOKIE", "12345"); 
    cookie.Domain = Request.RequestUri.Host; 
    cookie.Path = "/"; 
    cookie.HttpOnly = true; 

    // Get user's profile 

    HttpResponseMessage res = Request.CreateResponse<UserProfileVM>(HttpStatusCode.OK, profile); 
    res.Headers.AddCookies(new CookieHeaderValue[] { cookie }); 

    return res; 
} 

Câu trả lời từ máy chủ như sau:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
Set-Cookie: STUPID-COOKIE=12345; domain=localhost; path=/; httponly 
Access-Control-Allow-Origin: * 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcUFJPSkVDVFNcU2Ftc2tpcC5TZXJ2aWNlV2ViTmV3XFNhbXNraXAuQXV0aEFQSVxTYW1za2lwLkF1dGhBUElcbG9naW4=?= 
X-Powered-By: ASP.NET 
Date: Wed, 18 Feb 2015 11:58:07 GMT 
Content-Length: 8019 

Thông báo tiêu đề sau đây:

Set-Cookie: STUPID-COOKIE=12345; domain=localhost; path=/; httponly 

Tuy nhiên, khi Tôi đi theo "Cookie" trong tab "Tài nguyên" trong Chrome, không có gì được đặt. Ngoài ra khi tôi gửi yêu cầu đến máy chủ, không có cookie nào nằm trong tiêu đề.

Dưới đây là đoạn code mà đọc cookie:

CookieHeaderValue cookie = Request.Headers.GetCookies("STUPID-COOKIE").FirstOrDefault(); 

cookie biến luôn là null.

Ứng dụng của tôi đang chạy trên http://localhost:53998 và dịch vụ chứng thực đang chạy trên http://localhost:60858

phiên bản My Chrome 40.0.2214.111.

Dưới đây là một GIF chứng minh vấn đề: http://i.imgur.com/q7lkXBz.gif

Edit: này có vẻ là không đặc hiệu vào Chrome. Điều này cũng không hoạt động trên FireFox (v35). GIF: http://i.imgur.com/ZewnEtc.gif

Trả lời

-1

Cuối cùng tôi đã giải quyết được vấn đề này.

Trong phản ứng từ các API tôi đã có thêm Access-Control-Allow-Credentials: true tiêu đề, hoặc bằng cách thêm những điều sau đây trong lớp WebApiConfig:

public static void Register(HttpConfiguration config) 
{ 
    var cors = new EnableCorsAttribute("*", "*", "*"); 
    cors.SupportsCredentials = true; 

    config.EnableCors(cors); 
} 

Sau đó, tôi đã phải kích hoạt nó trên client-side, bằng cách thiết lập withCredentials thuộc tính trong đối tượng XMLHTTPRequest đến true. Trong chức năng ứng dụng cấu hình AngularJS bạn có thể làm như sau:

$httpProvider.defaults.withCredentials = true; 

Ngoài ra, dành cho Chrome, tôi đã phải bỏ qua Domain (hoặc thiết lập nó như là null).

Hy vọng điều này sẽ giúp người khác đấu tranh với điều này.

+0

EnableCorsAttribute ("*", "*", "*") cực kỳ nguy hiểm và không bao giờ nên làm. Bạn vứt bỏ gần như tất cả các biện pháp bảo vệ chính sách cùng nguồn gốc và người dùng mở ứng dụng của bạn vào một loạt các cuộc tấn công trên nhiều trang web bao gồm cả các cuộc tấn công liên quan đến giả mạo trình duyệt. Bạn phải chính xác trong lĩnh vực, tiêu đề và phương pháp nào bạn cho phép. –

0

Tôi rất nghi ngờ rằng localhost không phải là tên miền hợp lệ để Chrome từ chối. Nếu bạn chỉ cần xóa 'domain = localhost' khỏi Set-Cookie thì nó sẽ hoạt động và Chrome sẽ gán tên miền cho localhost cho bạn.

Cá nhân tôi sẽ tạo ra một tên miền địa phương như "test.dev" và thêm nó vào Windows của bạn tổ chức tập tin, 127.0.0.1 test.dev

+0

Đây là một vấn đề khác, việc xóa tên miền không hoạt động. Xem câu trả lời dưới đây. – Gaui

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