using Microsoft.AspNetCore.Http; using Umbraco.Cms.Core.Web; namespace Umbraco.Cms.Web.Common.AspNetCore; /// /// An implementation for ASP.NET Core. /// public class AspNetCoreCookieManager : ICookieManager { private readonly IHttpContextAccessor _httpContextAccessor; /// /// Initializes a new instance of the class. /// /// The . public AspNetCoreCookieManager(IHttpContextAccessor httpContextAccessor) => _httpContextAccessor = httpContextAccessor; /// public void ExpireCookie(string cookieName) { HttpContext? httpContext = _httpContextAccessor.HttpContext; if (httpContext is null) { return; } var cookieValue = httpContext.Request.Cookies[cookieName]; httpContext.Response.Cookies.Append( cookieName, cookieValue ?? string.Empty, new CookieOptions { Expires = DateTime.Now.AddYears(-1), }); } /// public string? GetCookieValue(string cookieName) => _httpContextAccessor.HttpContext?.Request.Cookies[cookieName]; /// public void SetCookieValue(string cookieName, string value, bool httpOnly, bool secure, string sameSiteMode) { SameSiteMode sameSiteModeValue = ParseSameSiteMode(sameSiteMode); _httpContextAccessor.HttpContext?.Response.Cookies.Append( cookieName, value, new CookieOptions { HttpOnly = httpOnly, SameSite = sameSiteModeValue, Secure = secure, }); } private static SameSiteMode ParseSameSiteMode(string sameSiteMode) => Enum.TryParse(sameSiteMode, ignoreCase: true, out SameSiteMode result) ? result : throw new ArgumentException($"The provided {nameof(sameSiteMode)} value could not be parsed into as SameSiteMode value.", nameof(sameSiteMode)); /// public bool HasCookie(string cookieName) => GetCookieValue(cookieName) is not null; }