Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan cara mengirim dan menerima cookie HTTP di Web API.
Latar belakang cookie HTTP
Bagian ini memberikan gambaran singkat tentang bagaimana cookie diimplementasikan di tingkat HTTP. Untuk detailnya, lihat RFC 6265.
Cookie adalah bagian dari data yang dikirim server dalam respons HTTP. Klien (opsional) menyimpan cookie dan mengembalikannya pada permintaan berikutnya. Ini memungkinkan klien dan server untuk berbagi status. Untuk mengatur cookie, server menyertakan header Set-Cookie dalam respons. Format cookie adalah pasangan nama-nilai, dengan atribut opsional. Contohnya:
Set-Cookie: session-id=1234567
Berikut adalah contoh dengan atribut:
Set-Cookie: session-id=1234567; max-age=86400; domain=example.com; path=/;
Untuk mengembalikan cookie ke server, klien menyertakan header Cookie dalam permintaan selanjutnya.
Cookie: session-id=1234567
Respons HTTP dapat menyertakan beberapa header Set-Cookie.
Set-Cookie: session-token=abcdef;
Set-Cookie: session-id=1234567;
Klien mengembalikan beberapa cookie menggunakan satu header Cookie.
Cookie: session-id=1234567; session-token=abcdef;
Cakupan dan durasi cookie dikendalikan oleh atribut berikut di header Set-Cookie:
- Domain: Memberi tahu klien domain mana yang harus menerima cookie. Misalnya, jika domain adalah "example.com", klien mengembalikan cookie ke setiap subdomain example.com. Jika tidak ditentukan, domain adalah server asal.
- Jalur: Membatasi cookie ke jalur yang ditentukan dalam domain. Jika tidak ditentukan, jalur URI permintaan digunakan.
- Kedaluwarsa: Menetapkan tanggal kedaluwarsa untuk cookie. Klien menghapus cookie saat kedaluwarsa.
- Usia Maks: Menetapkan usia maksimum untuk cookie. Klien menghapus cookie ketika mencapai usia maksimum.
Jika keduanya Expires dan Max-Age ditetapkan, Max-Age diutamakan. Jika tidak diatur, klien menghapus cookie ketika sesi saat ini berakhir. (Arti yang tepat dari "sesi" ditentukan oleh agen pengguna.)
Namun, ketahuilah bahwa klien dapat mengabaikan cookie. Misalnya, pengguna mungkin menonaktifkan cookie karena alasan privasi. Klien dapat menghapus cookie sebelum kedaluwarsa, atau membatasi jumlah cookie yang disimpan. Untuk alasan privasi, klien sering menolak cookie "pihak ketiga", di mana domain tidak cocok dengan server asal. Singkatnya, server tidak boleh mengandalkan mendapatkan kembali cookie yang ditetapkannya.
Cookie di API Web
Untuk menambahkan cookie ke respons HTTP, buat instans CookieHeaderValue yang mewakili cookie. Kemudian panggil metode ekstensi AddCookies , yang didefinisikan dalam System.Net.Http. Kelas HttpResponseHeadersExtensions , untuk menambahkan cookie.
Misalnya, kode berikut menambahkan cookie dalam tindakan pengontrol:
public HttpResponseMessage Get()
{
var resp = new HttpResponseMessage();
var cookie = new CookieHeaderValue("session-id", "12345");
cookie.Expires = DateTimeOffset.Now.AddDays(1);
cookie.Domain = Request.RequestUri.Host;
cookie.Path = "/";
resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
return resp;
}
Perhatikan bahwa AddCookies mengambil array instans CookieHeaderValue .
Untuk mengekstrak cookie dari permintaan klien, panggil metode GetCookies :
string sessionId = "";
CookieHeaderValue cookie = Request.Headers.GetCookies("session-id").FirstOrDefault();
if (cookie != null)
{
sessionId = cookie["session-id"].Value;
}
CookieHeaderValue berisi kumpulan instans CookieState. Setiap CookieState mewakili satu cookie. Gunakan metode pengindeks untuk mendapatkan CookieState berdasarkan nama, seperti yang ditunjukkan.
Data Cookie Terstruktur
Banyak browser membatasi berapa banyak cookie yang akan mereka simpan—jumlah total, dan jumlah per domain. Oleh karena itu, dapat berguna untuk memasukkan data terstruktur ke dalam satu cookie, alih-alih mengatur beberapa cookie.
Catatan
RFC 6265 tidak menentukan struktur data cookie.
Dengan menggunakan kelas CookieHeaderValue , Anda dapat meneruskan daftar pasangan nama-nilai untuk data cookie. Pasangan nama-nilai ini dikodekan sebagai data formulir yang dikodekan URL di header Set-Cookie:
var resp = new HttpResponseMessage();
var nv = new NameValueCollection();
nv["sid"] = "12345";
nv["token"] = "abcdef";
nv["theme"] = "dark blue";
var cookie = new CookieHeaderValue("session", nv);
resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
Kode sebelumnya menghasilkan header Set-Cookie berikut:
Set-Cookie: session=sid=12345&token=abcdef&theme=dark+blue;
Kelas CookieState menyediakan metode pengindeks untuk membaca sub-nilai dari cookie dalam pesan permintaan:
string sessionId = "";
string sessionToken = "";
string theme = "";
CookieHeaderValue cookie = Request.Headers.GetCookies("session").FirstOrDefault();
if (cookie != null)
{
CookieState cookieState = cookie["session"];
sessionId = cookieState["sid"];
sessionToken = cookieState["token"];
theme = cookieState["theme"];
}
Contoh: Mengatur dan Mengambil Cookie di Handler Pesan
Contoh sebelumnya menunjukkan cara menggunakan cookie dari dalam pengontrol Api Web. Opsi lain adalah menggunakan penangan pesan. Penangan pesan dipanggil sebelumnya dalam alur daripada pengontrol. Handler pesan dapat membaca cookie dari permintaan sebelum permintaan mencapai pengontrol, atau menambahkan cookie ke respons setelah pengontrol menghasilkan respons.
Kode berikut menunjukkan penanganan pesan untuk membuat ID sesi. ID sesi disimpan dalam cookie. Handler memeriksa permintaan untuk cookie sesi. Jika permintaan tidak menyertakan cookie, handler akan menghasilkan ID sesi baru. Dalam kedua kasus, handler menyimpan ID sesi di tas properti HttpRequestMessage.Properties . Ini juga menambahkan cookie sesi ke respons HTTP.
Implementasi ini tidak memvalidasi bahwa ID sesi dari klien benar-benar dikeluarkan oleh server. Jangan gunakan sebagai bentuk autentikasi! Inti dari contoh ini adalah untuk menunjukkan manajemen cookie HTTP.
using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
public class SessionIdHandler : DelegatingHandler
{
public static string SessionIdToken = "session-id";
async protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
string sessionId;
// Try to get the session ID from the request; otherwise create a new ID.
var cookie = request.Headers.GetCookies(SessionIdToken).FirstOrDefault();
if (cookie == null)
{
sessionId = Guid.NewGuid().ToString();
}
else
{
sessionId = cookie[SessionIdToken].Value;
try
{
Guid guid = Guid.Parse(sessionId);
}
catch (FormatException)
{
// Bad session ID. Create a new one.
sessionId = Guid.NewGuid().ToString();
}
}
// Store the session ID in the request property bag.
request.Properties[SessionIdToken] = sessionId;
// Continue processing the HTTP request.
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
// Set the session ID as a cookie in the response message.
response.Headers.AddCookies(new CookieHeaderValue[] {
new CookieHeaderValue(SessionIdToken, sessionId)
});
return response;
}
}
Pengontrol bisa mendapatkan ID sesi dari tas properti HttpRequestMessage.Properties .
public HttpResponseMessage Get()
{
string sessionId = Request.Properties[SessionIdHandler.SessionIdToken] as string;
return new HttpResponseMessage()
{
Content = new StringContent("Your session ID = " + sessionId)
};
}