ASP.NET Web API’de HTTP Tanımlama Bilgileri

Bu konuda, Web API'sinde HTTP tanımlama bilgilerinin nasıl gönderilip alındığı açıklanmaktadır.

HTTP Tanımlama Bilgileri arka planı

Bu bölümde tanımlama bilgilerinin HTTP düzeyinde nasıl uygulandığına ilişkin kısa bir genel bakış sağlanır. Ayrıntılar için RFC 6265'e başvurun.

Tanımlama bilgisi, sunucunun HTTP yanıtında gönderdiği verilerden oluşan bir parçadır. İstemci (isteğe bağlı olarak) tanımlama bilgisini depolar ve sonraki isteklerde döndürür. Bu, istemci ve sunucunun durumu paylaşmasına olanak tanır. Tanımlama bilgisi ayarlamak için sunucu yanıtta bir Set-Cookie üst bilgisi içerir. Tanımlama bilgisinin biçimi, isteğe bağlı özniteliklere sahip bir ad-değer çiftidir. Örnek:

Set-Cookie: session-id=1234567

Öznitelikleri olan bir örnek aşağıda verilmiştir:

Set-Cookie: session-id=1234567; max-age=86400; domain=example.com; path=/;

Sunucuya bir tanımlama bilgisi döndürmek için, istemci sonraki isteklerde bir Tanımlama Bilgisi üst bilgisi içerir.

Cookie: session-id=1234567

İstemcinin sonraki isteklerde Bir Tanımlama Bilgisi üst bilgisi içerdiği sunucuya bir tanımlama bilgisi döndürme işleminin diyagramı.

HTTP yanıtı birden çok Set-Cookie üst bilgisi içerebilir.

Set-Cookie: session-token=abcdef;
Set-Cookie: session-id=1234567;

İstemci, tek bir Tanımlama Bilgisi üst bilgisi kullanarak birden çok tanımlama bilgisi döndürür.

Cookie: session-id=1234567; session-token=abcdef;

Tanımlama bilgisinin kapsamı ve süresi, Set-Cookie üst bilgisindeki aşağıdaki özniteliklerle denetlenmektedir:

  • Etki Alanı: İstemciye tanımlama bilgisini alması gereken etki alanını bildirir. Örneğin, etki alanı "example.com" ise, istemci tanımlama bilgisini example.com her alt etki alanına döndürür. Belirtilmezse, etki alanı kaynak sunucudur.
  • Yol: Tanımlama bilgisini etki alanı içinde belirtilen yol ile kısıtlar. Belirtilmezse, istek URI'sinin yolu kullanılır.
  • Süre sonu: Tanımlama bilgisi için bir sona erme tarihi ayarlar. İstemci, süresi dolduğunda tanımlama bilgisini siler.
  • Maksimum Yaş: Tanımlama bilgisi için maksimum yaşı ayarlar. İstemci, en büyük yaşa ulaştığında tanımlama bilgisini siler.

Ve Max-Age her ikisi de Expires ayarlandıysa öncelik Max-Age kazanır. Hiçbiri ayarlı değilse, geçerli oturum sona erdiğinde istemci tanımlama bilgisini siler. ("Oturumun" tam anlamı kullanıcı aracısı tarafından belirlenir.)

Ancak, istemcilerin tanımlama bilgilerini yoksayabileceğini unutmayın. Örneğin, bir kullanıcı gizlilik nedeniyle tanımlama bilgilerini devre dışı bırakabilir. İstemciler süresi dolmadan önce tanımlama bilgilerini silebilir veya depolanan tanımlama bilgilerinin sayısını sınırlayabilir. Gizlilik nedenleriyle, istemciler genellikle etki alanının kaynak sunucuyla eşleşmediği "üçüncü taraf" tanımlama bilgilerini reddeder. Kısacası, sunucu ayardığı tanımlama bilgilerini geri almaya güvenmemelidir.

Web API'sindeki tanımlama bilgileri

HTTP yanıtına tanımlama bilgisi eklemek için tanımlama bilgisini temsil eden bir CookieHeaderValue örneği oluşturun. Ardından, System.Net.Http dosyasında tanımlanan AddCookies uzantısı yöntemini çağırın . Tanımlama bilgisini eklemek için HttpResponseHeadersExtensions sınıfı.

Örneğin, aşağıdaki kod bir denetleyici eylemi içine bir tanımlama bilgisi ekler:

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;
}

AddCookies'in bir CookieHeaderValue örnekleri dizisi aldığına dikkat edin.

İstemci isteğinden tanımlama bilgilerini ayıklamak için GetCookies yöntemini çağırın:

string sessionId = "";

CookieHeaderValue cookie = Request.Headers.GetCookies("session-id").FirstOrDefault();
if (cookie != null)
{
    sessionId = cookie["session-id"].Value;
}

CookieHeaderValue, CookieState örneklerinin bir koleksiyonunu içerir. Her CookieState bir tanımlama bilgisini temsil eder. Gösterildiği gibi ada göre CookieState almak için dizin oluşturucu yöntemini kullanın.

Birçok tarayıcı, hem toplam sayı hem de etki alanı başına sayı olmak üzere kaç tane tanımlama bilgisi depolayacaklarını sınırlar. Bu nedenle, birden çok tanımlama bilgisi ayarlamak yerine yapılandırılmış verileri tek bir tanımlama bilgisine yerleştirmek yararlı olabilir.

Not

RFC 6265 tanımlama bilgisi verilerinin yapısını tanımlamaz.

CookieHeaderValue sınıfını kullanarak tanımlama bilgisi verileri için ad-değer çiftlerinin listesini geçirebilirsiniz. Bu ad-değer çiftleri, Set-Cookie üst bilgisinde URL ile kodlanmış form verileri olarak kodlanır:

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 });

Önceki kod aşağıdaki Set-Cookie üst bilgisini üretir:

Set-Cookie: session=sid=12345&token=abcdef&theme=dark+blue;

CookieState sınıfı, istek iletisindeki bir tanımlama bilgisinden alt değerleri okumak için bir dizin oluşturucu yöntemi sağlar:

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"];
}

Örnek: İleti İşleyicisinde Tanımlama Bilgilerini Ayarlama ve Alma

Önceki örneklerde web API'sinin içinden tanımlama bilgilerinin nasıl kullanılacağı gösterildi. Bir diğer seçenek de ileti işleyicilerini kullanmaktır. İleti işleyicileri, denetleyicilerden daha önce işlem hattında çağrılır. İleti işleyicisi, istek denetleyiciye ulaşmadan önce istekten tanımlama bilgilerini okuyabilir veya denetleyici yanıtı oluşturduktan sonra yanıta tanımlama bilgileri ekleyebilir.

bir ileti işleyicisinde tanımlama bilgilerini ayarlama ve alma işleminin diyagramı. İleti işleyicilerinin, denetleyicilerden daha önce işlem hattında nasıl çağrıldığı gösterilir.

Aşağıdaki kod, oturum kimlikleri oluşturmaya yönelik bir ileti işleyicisini gösterir. Oturum kimliği bir tanımlama bilgisinde depolanır. İşleyici, oturum tanımlama bilgisi isteğini denetler. İstek tanımlama bilgisini içermiyorsa, işleyici yeni bir oturum kimliği oluşturur. her iki durumda da işleyici, oturum kimliğini HttpRequestMessage.Properties özellik paketinde depolar. Ayrıca oturum tanımlama bilgisini HTTP yanıtına ekler.

Bu uygulama, istemciden gelen oturum kimliğinin sunucu tarafından verildiğini doğrulamaz. Bunu bir kimlik doğrulaması biçimi olarak kullanmayın! Örneğin amacı HTTP tanımlama bilgisi yönetimini göstermektir.

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;
    }
}

Denetleyici , HttpRequestMessage.Properties özellik paketinden oturum kimliğini alabilir.

public HttpResponseMessage Get()
{
    string sessionId = Request.Properties[SessionIdHandler.SessionIdToken] as string;

    return new HttpResponseMessage()
    {
        Content = new StringContent("Your session ID = " + sessionId)
    };
}