2012-03-28 30 views
5

Tôi đã thực hiện một Dịch vụ Web RESTful đơn giản (chỉ GET, cho đến bây giờ) bằng cách sử dụng Microsoft ASP.NET MVC 4 ApiController.Microsoft MVC 4, APIController và Dịch vụ Web đăng nhập RESTful thích hợp

Bây giờ tôi đang tìm đúng cách để triển khai hệ thống ủy quyền cho dịch vụ. Tôi biết tôi không muốn sử dụng được xây dựng trong FormsAuthentication, vì tôi không muốn có một trang đăng nhập duy nhất cho tất cả các ứng dụng bằng cách sử dụng WS của tôi; hơn nữa, nó phá vỡ mô hình RESTful, buộc chuyển hướng và không thông báo cho khách hàng với mã trạng thái thích hợp 401.

Vì vậy, tôi đã vô hiệu hóa FormsAuthentication xóa những dòng này từ tôi web.config:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

và thêm những điều sau đây:

<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="FormsAuthentication" /> 
</modules> 

Tôi đã có tài ApiController để quản lý việc đăng nhập tài khoản, mà về cơ bản kiểm tra thông tin đăng nhập vào cơ sở dữ liệu của tôi và trả lại người dùng hoặc 401 nếu thông tin đăng nhập không hợp lệ.

Tôi đã đọc rằng tôi phải triển khai API MembershipAuthorization, nhưng tôi không tìm thấy gì giúp tôi thực hiện từ đầu. Bạn có ý tưởng gì không? Tôi có cần phải quản lý cookie và authcodes trên cơ sở dữ liệu hoặc là có một lớp học tương tự để FormsAuthentication mà nó cho tôi?

Trả lời

3

Tôi đã tìm thấy giải pháp, về cơ bản tôi đã sử dụng giải pháp thay thế được hiển thị trong example của Microsoft.

  1. Tạo thư mục có tên App_Start.
  2. Đặt twoclasses với các không gian tên thích hợp.
  3. FormsAuthentication và hệ thống xử lý yêu cầu/phản hồi bổ sung sẽ thực hiện phần còn lại.

Vì tôi không thích "Nội dung chuyển here" để đáp ứng 401 của tôi, tôi đã chỉnh sửa phương pháp OnEndRequest theo cách này:

private void OnEndRequest(object source, EventArgs args) 
    { 
     var context = (HttpApplication)source; 
     var response = context.Response; 

     if (context.Context.Items.Contains("__WEBAPI:Authentication-Fixup")) 
     { 
      response.StatusCode = (int)context.Context.Items[FixupKey]; 
      response.RedirectLocation = null; 
      // Clear the page content, since I don't want the "Content moved here." body 
      response.ClearContent(); 
     } 
    } 

Tài liệu tham khảo:

2

Thanh toán số này project on github. Họ đã phát triển một số lớp, với các ví dụ, để tăng cường bảo mật cho ASP.NET Web API. Một trong những mô hình bảo mật được hỗ trợ là xác thực cơ bản, có vẻ như đó là những gì bạn mô tả trong câu hỏi của mình.

+0

Có vẻ như tôi cần ví dụ đầu tiên, 'BasicAuthentication'. Nhưng tôi chưa hiểu nếu có một cách để lưu trữ các authcode (Tôi sẽ không gửi tên người dùng và mật khẩu cho khách hàng như authcode) trong một cơ sở dữ liệu. – frapontillo

+0

Tôi không chắc mình hiểu ý của bạn là "cách lưu trữ mã xác thực". Mô tả của bạn về authcode là gì. Với xác thực cơ bản, bạn muốn mã hóa tên người dùng/mật khẩu được gửi qua và giải mã nó ở đầu bên kia.Bạn cũng muốn sử dụng HTTPS/SSL/TSL với xác thực cơ bản để mã hóa toàn bộ thư trên dây. Khi lưu trữ mật khẩu trong DB, tôi luôn sử dụng mã hóa một chiều cho mật khẩu đã lưu. Sau đó, bạn sử dụng cùng một mã hóa trên mật khẩu người dùng nhập trước khi thực hiện so sánh những gì có trong DB. –

+0

Tôi muốn tạo một mã số tạm thời cho mỗi lần đăng nhập và lưu trữ nó trong cơ sở dữ liệu. Mà tôi nghĩ là điều tương tự mà FormsAuthentication thực hiện: nó tạo ra một mã ủy quyền phiên được liên kết chặt chẽ với người dùng đã đăng nhập. – frapontillo

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