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.
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
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:
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.
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 (*)
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 đã.
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ả:
Đâ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/).
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.
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
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é.
cho mình cái project mẫu này nhé
ReplyDeletebạn lấy ở đây nhé
Deletehttps://github.com/oclockvn/web-api-authorization
thanks
Deletetậ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.
ReplyDeletehi @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é
DeleteMì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