cho phép người dùng đăng nhập vào API
Bạn cần gửi một cookie Xác thực Mẫu hợp lệ cùng với yêu cầu. Cookie này thường được gửi bởi máy chủ khi xác thực ( LogOn
hành động) bằng cách gọi [FormsAuthentication.SetAuthCookie
phương thức (xem MSDN ).
Vì vậy, khách hàng cần thực hiện 2 bước:
- Gửi một yêu cầu HTTP cho một
LogOn
hành động bằng cách gửi tên người dùng và mật khẩu. Đổi lại, hành động này sẽ gọi FormsAuthentication.SetAuthCookie
phương thức (trong trường hợp thông tin xác thực hợp lệ), từ đó sẽ đặt cookie xác thực biểu mẫu trong phản hồi.
- Gửi yêu cầu HTTP đến một
[Authorize]
hành động được bảo vệ bằng cách gửi cùng cookie xác thực biểu mẫu mà nó đã truy xuất trong yêu cầu đầu tiên.
Hãy lấy một ví dụ. Giả sử rằng bạn có 2 bộ điều khiển API được xác định trong ứng dụng web của mình:
Người đầu tiên chịu trách nhiệm xử lý xác thực:
public class AccountController : ApiController
{
public bool Post(LogOnModel model)
{
if (model.Username == "john" && model.Password == "secret")
{
FormsAuthentication.SetAuthCookie(model.Username, false);
return true;
}
return false;
}
}
và cái thứ hai chứa các hành động được bảo vệ mà chỉ người dùng được ủy quyền mới có thể xem:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
Bây giờ chúng ta có thể viết một ứng dụng khách sử dụng API này. Đây là một ví dụ ứng dụng bảng điều khiển nhỏ (đảm bảo bạn đã cài đặt các gói Microsoft.AspNet.WebApi.Client
và Microsoft.Net.Http
NuGet):
using System;
using System.Net.Http;
using System.Threading;
class Program
{
static void Main()
{
using (var httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(
"http://localhost:26845/api/account",
new { username = "john", password = "secret" },
CancellationToken.None
).Result;
response.EnsureSuccessStatusCode();
bool success = response.Content.ReadAsAsync<bool>().Result;
if (success)
{
var secret = httpClient.GetStringAsync("http://localhost:26845/api/users");
Console.WriteLine(secret.Result);
}
else
{
Console.WriteLine("Sorry you provided wrong credentials");
}
}
}
}
Và đây là cách 2 yêu cầu HTTP trông như thế nào trên dây:
Yêu cầu xác thực:
POST /api/account HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: localhost:26845
Content-Length: 39
Connection: Keep-Alive
{"username":"john","password":"secret"}
Phản hồi xác thực:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: .ASPXAUTH=REMOVED FOR BREVITY; path=/; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 4
Connection: Close
true
Yêu cầu dữ liệu được bảo vệ:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
Phản hồi cho dữ liệu được bảo vệ:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 13 Jun 2012 13:24:41 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 66
Connection: Close
"This is a top secret material that only authorized users can see"