อนุญาตให้ผู้ใช้เข้าสู่ระบบ API
คุณต้องส่งคุกกี้ Forms Authentication ที่ถูกต้องพร้อมกับคำขอ โดยปกติเซิร์ฟเวอร์จะส่งคุกกี้นี้เมื่อตรวจสอบสิทธิ์ ( LogOn
การดำเนินการ) โดยเรียกใช้[FormsAuthentication.SetAuthCookie
เมธอด (ดูMSDN )
ดังนั้นลูกค้าต้องดำเนินการ 2 ขั้นตอน:
- ส่งคำขอ HTTP เพื่อ
LogOn
ดำเนินการโดยส่งชื่อผู้ใช้และรหัสผ่าน ในทางกลับกันการดำเนินการนี้จะเรียกใช้FormsAuthentication.SetAuthCookie
เมธอด (ในกรณีที่ข้อมูลรับรองถูกต้อง) ซึ่งจะตั้งค่าคุกกี้การตรวจสอบรูปแบบในการตอบกลับ
- ส่งคำขอ HTTP ไปยังการ
[Authorize]
ดำเนินการที่ได้รับการป้องกันโดยการส่งไปตามคุกกี้การตรวจสอบความถูกต้องของแบบฟอร์มที่เรียกมาในคำขอแรก
ลองมาเป็นตัวอย่าง สมมติว่าคุณมีตัวควบคุม API 2 ตัวที่กำหนดไว้ในเว็บแอปพลิเคชันของคุณ:
คนแรกที่รับผิดชอบในการจัดการการรับรองความถูกต้อง:
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;
}
}
และรายการที่สองมีการดำเนินการที่มีการป้องกันซึ่งมีเพียงผู้ใช้ที่ได้รับอนุญาตเท่านั้นที่สามารถมองเห็น:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
ตอนนี้เราสามารถเขียนแอปพลิเคชันไคลเอนต์ที่ใช้ API นี้ได้ นี่คือตัวอย่างแอปพลิเคชันคอนโซลที่ไม่สำคัญ (ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งMicrosoft.AspNet.WebApi.Client
และ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");
}
}
}
}
และนี่คือลักษณะของคำขอ HTTP 2 รายการบนสาย:
คำขอรับรองความถูกต้อง:
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"}
การตอบสนองการรับรองความถูกต้อง:
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
ขอข้อมูลที่มีการป้องกัน:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
การตอบสนองสำหรับข้อมูลที่มีการป้องกัน:
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"