Saltar al contenido

¿Cómo puedo verificar si hay una cookie de respuesta en Asp.net Core MVC (también conocido como Asp.Net 5 RC1)?

Solución:

Así es como obtengo el value de una cookie de una Respuesta. Algo como esto podría usarse para obtener la cookie completa si es necesario:

string GetCookieValueFromResponse(HttpResponse response, string cookieName)
{
  foreach (var headers in response.Headers.Values)
    foreach (var header in headers)
      if (header.StartsWith($"{cookieName}="))
      {
        var p1 = header.IndexOf('=');
        var p2 = header.IndexOf(';');
        return header.Substring(p1 + 1, p2 - p1 - 1);
      }
  return null;
}

Hay un método de extensión disponible en Microsoft.AspNetCore.Http.Extensions llamado GetTypedHeaders(). Esto se puede llamar HttpContext.Response leer Set-Cookie encabezados. Por ejemplo, en middleware tal vez queramos interceptar un Set-Cookie encabezado de respuesta y reemplácelo:

  public async Task Invoke(HttpContext httpContext)
        {
            httpContext.Response.OnStarting(state =>
            {
                var context = (HttpContext)state;

                var setCookieHeaders = context.Response.GetTypedHeaders().SetCookie;

                // We assume only one cookie is found. You could loop over multiple matches instead.
                // setCookieHeaders may be null if response doesn't contain set-cookie headers
                var cookie = setCookieHeaders?.FirstOrDefault(x => x.Name == "mycookiename");

                if (cookie == null)
                {
                    return Task.CompletedTask;
                }

                var opts = new CookieOptions
                {
                    HttpOnly = true,
                    Expires = DateTimeOffset.Now.AddHours(12),
                    SameSite = SameSiteMode.Lax,
                    Secure = true
                };

                context.Response.Cookies.Delete(cookie.Name.Value);
                context.Response.Cookies.Append(cookie.Name.Value, "mynewcookievalue", opts);
                
                return Task.CompletedTask;

            }, httpContext);

            await _next(httpContext);
        }

Hay un problema obvio con la respuesta de Shaun: coincidirá con cualquier encabezado HTTP que tenga un valor coincidente. La idea debería ser hacer coincidir solo galletas.

Un pequeño cambio como este debería funcionar:

string GetCookieValueFromResponse(HttpResponse response, string cookieName)
{
  foreach (var headers in response.Headers)
  {
    if (headers.Key != "Set-Cookie")
      continue;
    string header = headers.Value;
    if (header.StartsWith($"{cookieName}="))
    {
      var p1 = header.IndexOf('=');
      var p2 = header.IndexOf(';');
      return header.Substring(p1 + 1, p2 - p1 - 1);
    }
  }
  return null;
}

Ahora, la comprobación de un nombre de cookie se dirigirá solo a los encabezados de cookies reales.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *