2015-03-27 19 views
6

Tôi đã có một giải pháp với 2 dự án. Một là một ứng dụng web ASP.NET MVC và một là một dự án Web API. Những gì tôi muốn làm là chia sẻ cookie giữa 2 ứng dụng. Khi triển khai trên máy chủ ứng dụng đầu tiên được lưu trữ trên mydomain.com và người kia ở api.mydomain.com (sub-domain). Tôi cũng sử dụng https. Tôi sử dụng ASP.NET Identity trong dự án MVC như một hệ thống xác thực. Sau khi đọc rất nhiều bài báo trên internet tôi đã làm như sau:Chia sẻ cookie giữa dự án ASP.NET MVC và dự án API Web

1) Trong file web.config, trong cả hai dự án, đã bao gồm máy thẻ chính sau đây.

<machineKey validationKey="3DF5D185FFB897592E14ED51A6DDC3E2729827A2F2180151A1BC39BE5C035D15F23700C928EFDBACEAEE498D05B76C65537FDEFB673039BCD961045C3BA8ACD3" 
      decryptionKey="CE274BA1DB61C086A80F5D8BD1AC5AC92A8BA19F37E04FC7" validation="SHA1" /> 

2) Trong dự án MVC tôi đã cấu hình các ASP.NET nhận dạng Cookie theo cách sau:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Home/index"), 
     Provider = new CookieAuthenticationProvider 
     { 
      OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(TimeSpan.FromMinutes(30), (manager, user) => user.GenerateUserIdentityAsync(manager)) 
     }, 
     SlidingExpiration = true, 
     ExpireTimeSpan = TimeSpan.FromMinutes(45), 
     CookieName = "MyCookie", 
     CookieDomain = ".mydomain.com" 
}); 

3) Trong dự án Web API tôi đã kích hoạt và cấu hình CORS và tôi đã thêm các cấu hình sau trong web.config (CORS đang làm việc tốt trong môi trường sản xuất):

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Credentials" value="true"></add> 
    <add name="Access-Control-Allow-Origin" value="mydomain.com" /> 
    <add name="Access-Control-Allow-Headers" value="content-type" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    </customHeaders> 
</httpProtocol> 

4) tôi đã thêm phần httpCookies (trong cả hai dự án) như sau:

<httpCookies requireSSL="true" domain=".mydomain.com" httpOnlyCookies="true" /> 

Trong điều khiển Web API của tôi đã áp dụng Authorize thuộc tính như sau:

[Authorize] 
public class MyController : ApiController 
{ 
    //My action methods here 
} 

Cuối cùng từ dự án MVC tôi cố gắng để gọi dịch vụ của tôi sử dụng một yêu cầu jQuery Ajax.

$.ajax({ 
    url: viewModelParameters.myUrl, 
    type: "get", 
    dataType: "json", 
    data: { userId: viewModelParameters.id }, 
    xhrFields: { 
     withCredentials: true 
    }, 
    crossDomain: true, 
    statusCode: { 
     200: function (user) { 
     } 
    } 
}); 

Tôi nhận được thông báo sau:

Authorization đã bị từ chối cho yêu cầu này.

Trong tiêu đề yêu cầu, tôi có thể thấy cookie được đưa vào yêu cầu. Bạn có thể vui lòng đề xuất một giải pháp hoặc suy nghĩ về những gì tôi bỏ lỡ? Cảm ơn bạn trước.

+0

bạn có nhận xét về 'SuppressDefaultHostAuthentication' trong WebApiConfig của bạn không? –

+0

Xin chào, rất tiếc, tôi không có câu trả lời cho câu hỏi của bạn, nhưng tôi muốn nói rằng cookie của bạn không an toàn nữa sau khi bạn đăng các khóa bí mật trong câu hỏi của mình. – dustinmoris

Trả lời

0

bạn cần bao gồm các app.UseCookieAuthentication() ở cả WebAPI và các dự án MVC.

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