2012-09-20 33 views
6

Hiện tại, tôi có ứng dụng web MVC bán vật dụng. Người dùng đăng nhập vào hệ thống của chúng tôi bằng cách sử dụng xác thực biểu mẫu và sau đó có thể thực hiện các chức năng khác nhau dựa trên nhóm mà họ thuộc (ví dụ: Đặt hàng, Xem đơn hàng, Hủy đơn hàng, v.v.).Xác thực WebApi .NET

Chúng tôi đã được giao nhiệm vụ viết một Api để cung cấp cho bên thứ ba khả năng tạo và xem đơn đặt hàng trong hệ thống của chúng tôi. Mỗi bên thứ ba sẽ có tên người dùng riêng và sẽ bị giới hạn ở một số phương thức api nhất định dựa trên nhóm họ thuộc về.

Chúng tôi đang xem xét việc sử dụng Api Web làm cơ chế cung cấp api. Chúng tôi cũng muốn có thể tiêu thụ api này từ ứng dụng web MVC của chúng tôi. Thật không may, chúng tôi đang gặp sự cố với Xác thực cho Web Api. Sử dụng DelegatingHandler, chúng tôi đã triển khai Xác thực cơ bản qua SSL cho WebApi của chúng tôi. Điều này làm việc tuyệt vời cho các bên thứ ba của chúng tôi. Tuy nhiên, khi cố gắng tiêu thụ Api từ ứng dụng MVC của chúng tôi, chúng tôi nhận được 401 lỗi bị từ chối vì người dùng đã được xác thực trong ứng dụng MVC bằng cách sử dụng Xác thực biểu mẫu, nhưng chúng tôi không có cách nào chuyển các thông tin đăng nhập đó tới Web Api. Có cách nào để vượt qua các thông tin xác thực biểu mẫu Auth từ ứng dụng MVC của chúng tôi để ứng dụng api Web của chúng tôi?

IIS cài đặt WebSite tên WidgetStore với hai ứng dụng web

  • WidgetStore \ UI -sử dụng hình thức xác thực
  • WidgetStore \ Api - sử dụng xác thực cơ bản
+0

Để giải quyết vấn đề về Biểu mẫu/Cơ bản của bạn, tôi khuyên bạn nên đọc bài viết tuyệt vời này từ Dominick Baier: [Biểu mẫu/Chuyển đổi xác nhận quyền sở hữu xác thực cơ bản] (http://leastprivilege.com/2012/10/24/ extensions-to-the-web-apimvc-formsbasic-auth-sample-claim-transformation-and-ajax /) – Swell

Trả lời

9

Có cách nào để chuyển thông tin xác thực biểu mẫu xác thực từ ứng dụng MVC của chúng tôi tới ứng dụng api Web của chúng tôi?

Chắc chắn, chúng ta hãy xem ví dụ như hành động điều khiển MVC sau gọi API Web:

[Authorize] 
public ActionResult CallWebApi() 
{ 
    var baseAddress = new Uri("https://example.com"); 
    var cookieContainer = new CookieContainer(); 
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) 
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) 
    { 
     var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName].Value; 
     cookieContainer.Add(baseAddress, new Cookie(FormsAuthentication.FormsCookieName, authCookie)); 
     var result = client.GetAsync("/api/values").Result; 
     result.EnsureSuccessStatusCode(); 

     // now you can read the result.Content ... 
    } 
} 

này giả định rằng bạn cũng đã bật hình thức xác thực trong web.config của dự án Web API của bạn và rằng tên cookie giống với tên được sử dụng trong dự án MVC của bạn.

+0

Cảm ơn bạn đã trả lời. Nhưng, nếu tôi bật FormsAuthentication trong web.config của dự án API Web của tôi, bên thứ ba sẽ không thể xác thực. Họ sử dụng xác thực BASIC để kết nối với WebApi và nó sẽ không hoạt động nữa. Các bên thứ ba sẽ không có cookie FormsAuth – user1686249

+0

Nhưng trình xử lý ủy nhiệm xác thực biểu mẫu cơ bản của bạn trông như thế nào? Nếu có vẻ như vậy, bạn sẽ không gặp sự cố khi bật xác thực biểu mẫu: http://stackoverflow.com/a/11536349/29407 –

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