WEB API SECURITY

Yeah, phải rồi - Security - một phần rất quan trọng khi cung cấp api (*) cho bên thứ 2. May mắn thay, MS đã cung cấp cho ta phương thức security bằng membership. Với phương thức này, ta chỉ cần login bằng account đã đăng ký, mọi việc cứ để ASP.NET Identity lo.

web-api
(*) Trong phạm vi bài viết, khi nhắc đến api tức là mình đang nói tới Web API theo mô hình MVC. Và khi nhắc đến security tức là Individual accounts security của Web API trong Microsoft Visual Studio 2013 (VS2013)

tạo 1 web api

Tạo 1 api với Authentication Type là Individual User Accounts. Chạy thử project và gọi action Get trong ValuesController

api-auth

Request bị từ chối vì lỗi bảo mật. Tại sao lại như vậy? Hãy mở ValuesController ra và xem xét:

authorize attribute

Chỉ với Attribute Authorize, tất cả các Actions trong Controller đã được security. Đơn giản quá phải không? Bây giờ hãy thử bỏ attribute này ra và chạy lại, kết quả sẽ khác.

api no authorize

Câu hỏi đặt ra là, với những Actions/Controllers có sử dụng Authorize, làm sao ta có thể gọi chúng. Đó là nội dung tiếp theo mình sẽ cùng tìm hiểu.

ASP.NET Identity

Đây chính là cái mà MS sử dụng để security Indi Accounts. Khi đăng ký account, VS sẽ tạo ra database (code first) để lưu trữ thông tin account. Mặc định sẽ tạo ra 1 file .mdf trong thư mục App_Data của project

Để thay đổi điều đó, ta cần đổi connection string cho nó vào SQL Server (*)

Bạn cần đổi connection string cho đúng với máy của mình.

Với connection string như trên, khi tạo thành công account, thông tin sẽ được lưu trữ trong database có tên api_authorization.

Mình sẽ quay lại với api sau, api sẽ được gọi bằng 2 phần là client (ajax) và server (c#)

gọi api bằng ajax

Tạo 1 project khác, để đơn giản thì chỉ cần tạo empty project. Tại sao lại là 1 project khác mà không chạy trực tiếp trong project api? Các bạn sẽ biết ngay sau khi chạy thôi. Nhưng trước hết, cứ làm theo những gì mặc định mình nói cái đã.

empty project

Nội dung của file index.html chỉ đơn giản là 2 nút bấm, 1 để đăng ký tài khoản và 1 để lấy giá trị từ ValuesController

Để giải thích lý do tại sao lại phải tạo 2 project khác nhau, bạn hãy tạm bỏ Authorize cho ValuesController và gọi Get bằng ajax

Mọi thứ tưởng chừng đơn giản, nhưng hãy xem kết quả:

api cors

Đây chính là lý do tại sao lại viết trong 2 project khác nhau. Lỗi này là Cross-Origin-Resources-Sharing (CORS), mà để đơn giản và dễ hiểu, nó là lỗi khi gọi api bằng 1 request nằm ngoài nơi cung cấp api. Đơn giản hơn nữa là nơi gọi request (http://localhost:60902/) khác với nơi chứa api (http://localhost:60847/).

Mình sẽ giải thích về cors trong một ngày không xa. Còn trong phần này, chỉ cần mặc định làm theo.

khắc phục cors

May mắn thay, MS đã cung cấp 1 thư viện để xử lý việc này. Quay trở lại project api, mở nuget interface và cài đặt cors cho project api.

cors package

Việc còn lại là enable cors cho project (ở cấp độ global), hãy chú ý rằng enable cors trước bất cứ route nào của api

Và thử gọi lại bằng ajax

enabled cors

Ngon lành cành đào :))

Vì bài viết khá dài nên mình sẽ chia làm 3 phần, các bạn hãy xem tiếp phần 2 ở ... ngay sau đây nhé.

hết tập 1 :))

Comments

  1. cho mình cái project mẫu này nhé

    ReplyDelete
    Replies
    1. bạn lấy ở đây nhé
      https://github.com/oclockvn/web-api-authorization

      Delete
  2. tập tiếp theo tìm ở đâu jay a. e chưa hiểu mấy cái này nên e muốn tìm hiểu thêm.

    ReplyDelete
    Replies
    1. hi @ojotoka ki, bạn có thể xem #2 tại [đây](https://phantienquang.blogspot.com/2015/09/web-api-security-part-2.html) và #3 tại [đây](https://phantienquang.blogspot.com/2015/09/web-api-security-call-by-http-client.html) nhé

      Delete
  3. Mình chưa rõ là trong code phần sửa lí dữ liệu đầu vào với dữ liệu db là ở đâu

    ReplyDelete

Post a Comment

Popular posts from this blog

Gỡ bộ Visual Studio ra khỏi máy tính

Căn giữa thẻ div trong thẻ div