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)