2012-05-21 50 views
5

Tôi đã được yêu cầu tạo API cho khách hàng. Trước khi tôi bắt đầu, tôi có một số câu hỏi. Tôi đã quyết định sử dụng công nghệ ASP.NET Web API. Tôi đã tạo phương thức đầu tiên của mình và nó hoạt động tốt, tôi có thể trả về một tập hợp các kết quả của các sản phẩm theo định dạng XML/Json. Vấn đề là, bất kỳ ai truy cập vào API của tôi được lưu trữ tại trang web của tôi đều có thể xem tất cả các sản phẩm của tôi. Tôi đã có một cơ sở dữ liệu của khách hàng, làm thế nào tôi có thể sử dụng điều này để trước khi truy cập vào API của tôi, họ phải thiết lập một số thông tin đăng nhập.Câu hỏi về ASP.NET Web API - Ủy quyền/Xác thực

API nên có thể truy cập tới cả Web và khách hàng Desktop

Một cách tôi nghĩ làm việc đó, là họ vượt qua tên tài khoản/mật khẩu cùng thông số như nhưng didnt này dường như rất an toàn/phải ?. Ví dụ: api/products/GetById/750?username=bob&pass=123

Trả lời

7

Bạn có thể sử dụng để trang trí AuthorizeAttribute điều khiển của bạn/hành động.

[Authorize] 
public IEnumerable<Product> Get() {...} 

Điều này có thể hạn chế tài nguyên của bạn chỉ khả dụng cho người dùng được xác thực.

Phương thức xác thực thực tế là một câu chuyện khác. Theo mặc định, API Web sử dụng xác thực biểu mẫu ASP.NET dựa trên cookie, điều này là tốt nếu api được tiêu thụ trực tiếp từ trình khách web html + js. Mặt khác, nếu API của bạn được tiêu thụ bởi ứng dụng dành cho máy tính để bàn/thiết bị di động hoặc ứng dụng web cơ sở plugin, việc sử dụng xác thực HTTP cơ bản có thể tốt hơn vì bạn không phải quản lý cookie (nhớ sử dụng SSL trong trường hợp này)).

Bạn có thể muốn xem bài đăng trên blog của mình tại http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/ cho biết cách cung cấp xác thực cơ bản http sử dụng tư cách thành viên ASP.NET và nhà cung cấp vai trò.

+0

Điều này thật tuyệt, nhưng làm cách nào để khách hàng nhập thông tin đăng nhập của họ để được ủy quyền? Tôi có phải vạch trần một phương pháp không? – CallumVass

+0

Nó phụ thuộc vào plaform khách hàng bạn đang sử dụng. Ví dụ bằng cách sử dụng .NET WebClient, bạn có thể đặt thuộc tính WebClient.Credentials. –

3

Chắc chắn không phải qua chuỗi truy vấn.

Tại sao không sử dụng tư cách thành viên ASP.NET? MSDN

Hoặc, bạn có thể viết xác thực của riêng bạn và kiểm tra xem người dùng có quyền thích hợp trước khi trả lại danh sách sản phẩm hay không.

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

+0

Yeah, nhưng làm thế nào họ sẽ vượt qua trong thông tin của họ với nhà cung cấp thành viên/Custom Authenticator trước khi truy cập api của tôi? – CallumVass

+1

@DarrenDavies không có với REST bạn không thể, anh ấy đang sử dụng API Web. – mattytommo

+1

@BiffBaffBoff - Kiểm tra điều này: http://sixgun.co.uk/blog/2012/02/29/asp-net-web-api-basic-authentication/ –

3
  • Bạn muốn lưu trữ API của bạn bên trong một thư mục SSL. Điều đó sẽ mã hóa tất cả thông tin liên lạc (giống như việc gửi thẻ tín dụng của bạn # trên web)

  • Bạn cũng có thể mã hóa URL vì vậy nó sẽ đọc như thế này:

    api/products/GetById/750?u=828s388332e328e38&p=328e23e2i38324r423ur29834

    Nhưng điều này là một thách thức kể từ bây giờ bạn phải đồng bộ hóa phương pháp mã hóa được khách hàng của bạn sử dụng

  • Bạn cũng có thể sử dụng mã thông báo và yêu cầu khách hàng của bạn truy xuất mã thông báo có ngày hết hạn. Mã hết hạn (1 giờ hoặc 1 ngày, v.v.). Sau đó, các URL có thể trông như thế này:

    api/products/GetById/750?token=1241824123yxxcn2r348

  • Bạn cũng có thể sử dụng khóa công khai tin /: MSDN

+0

SSL là để mã hóa các thông tin liên lạc, nhưng không thực sự liên quan đến việc ủy ​​quyền hoặc xác thực, mà câu hỏi là về. –

+1

Mặc dù tiêu đề của câu hỏi là về Ủy quyền và Xác thực, anh ta lo lắng về việc truyền thông tin đăng nhập từ máy khách. SSL sẽ giúp giảm thiểu rủi ro. –

0

Sử dụng kết hợp Tên người dùng/Mật khẩu là tốt, nhưng thay vì đi qua chuỗi truy vấn, hãy thực hiện theo cách chuẩn hóa hơn (Xác thực HTTP cơ bản) để thêm thông tin này vào tiêu đề yêu cầu của thư. Đây là mã trông như thế nào:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://localhost:8010/api/Customer/1"); 
//Add a header to the request that contains our credentials 
//DO NOT HARDCODE IN PRODUCTION!! Pull credentials real-time from database or other store. 
string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user1"+ ":" + "test")); 
req.Headers.Add("Authorization", "Basic " + svcCredentials); 

Câu hỏi của bạn được gắn thẻ với cả 'WCF' và 'Web API' để kiểm tra phía máy chủ thông tin xác thực khác đôi chút. Tuy nhiên, về cơ bản bạn kéo tiêu đề 'Ủy quyền' và kiểm tra thông tin đăng nhập để xem liệu người dùng có được xác thực và được ủy quyền hay không. Nếu chúng không được xác thực, hãy trả lại thông báo HTTP 401.

Đối với WCF REST của dịch vụ dựa trên lưu trữ trong IIS, bạn có thể xem một ví dụ chi tiết đầy đủ từ một bài đăng blog của tôi:

Using Basic Authentication In REST Based Services Hosted in IIS