memungkinkan pengguna untuk masuk ke API
Anda perlu mengirim cookie Otentikasi Formulir yang valid bersama dengan permintaan. Cookie ini biasanya dikirim oleh server saat mengautentikasi ( LogOn
tindakan) dengan memanggil [FormsAuthentication.SetAuthCookie
metode (lihat MSDN ).
Jadi klien perlu melakukan 2 langkah:
- Kirim permintaan HTTP ke suatu
LogOn
tindakan dengan mengirimkan nama pengguna dan kata sandi. Secara bergiliran tindakan ini akan memanggil FormsAuthentication.SetAuthCookie
metode (jika kredensial valid) yang pada gilirannya akan mengatur cookie otentikasi formulir dalam respons.
- Mengirim permintaan HTTP ke
[Authorize]
tindakan yang dilindungi dengan mengirimkan cookie otentikasi bentuk yang diambilnya dalam permintaan pertama.
Mari kita ambil contoh. Misalkan Anda memiliki 2 pengontrol API yang ditentukan dalam aplikasi web Anda:
Yang pertama bertanggung jawab untuk menangani otentikasi:
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;
}
}
dan yang kedua berisi tindakan dilindungi yang hanya dapat dilihat oleh pengguna yang berwenang:
[Authorize]
public class UsersController : ApiController
{
public string Get()
{
return "This is a top secret material that only authorized users can see";
}
}
Sekarang kita bisa menulis aplikasi klien yang menggunakan API ini. Berikut contoh aplikasi konsol trivial (pastikan Anda telah menginstal Microsoft.AspNet.WebApi.Client
dan Microsoft.Net.Http
paket 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");
}
}
}
}
Dan inilah tampilan 2 permintaan HTTP di kabel:
Permintaan otentikasi:
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"}
Respon otentikasi:
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
Permintaan untuk data yang dilindungi:
GET /api/users HTTP/1.1
Host: localhost:26845
Cookie: .ASPXAUTH=REMOVED FOR BREVITY
Tanggapan untuk data yang dilindungi:
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"