/// <summary> /// Indica si se utilizara el servicio de autenticación. /// </summary> /// <param name="settings">Configuración del servicio.</param> /// <returns>AuthenticationOptions | ApplicationException: si CookiesSettings es nulo.</returns> public AuthenticationOptions WithCookies(CookiesSettings settings) { AuthenticationSettings.CookiesSettings = settings.ToIsNullOrEmptyThrow(nameof(settings)); return(this); }
/// <summary> /// Carga el servicio de autenticación por cookies. /// </summary> /// <param name="services">Colección de servicios.</param> /// <param name="settings">Configuración del servicio de autenticación por cookies.</param> /// <returns>IServiceCollection | ApplicationException: si CookiesSettings es nulo.</returns> internal static IServiceCollection LoadAuthCookies( this IServiceCollection services, CookiesSettings settings) { var config = settings.ToIsNullOrEmptyThrow(nameof(settings)); if (config.Enabled.HasValue && config.Enabled.Value) { var enviroment = services.ToEnvironment(); services .AddAuthentication(config.AuthenticateScheme !) .AddCookie(options => { // limita la cookie a HTTPS. Recomiendo configurar esto en Siempre en prod. Déjelo configurado en Ninguno en local. options.Cookie.SecurePolicy = enviroment.IsDevelopment() ? CookieSecurePolicy.None : CookieSecurePolicy.Always; // indica si el navegador puede usar la cookie con solicitudes entre sitios. // Para la autenticación OAuth, configúrelo en Lax. // Estoy configurando esto en Estricto porque la cookie de autenticación es solo para un único sitio. // Establecer esto en Ninguno no establece un valor de encabezado de cookie. options.Cookie.SameSite = SameSiteMode.Strict; options.Cookie.Name = config.CookieName; options.Cookie.HttpOnly = config.HttpOnly !.Value; options.ExpireTimeSpan = new TimeSpan( config.Expire.Days !.Value, config.Expire.Hours !.Value, config.Expire.Minutes !.Value, config.Expire.Seconds !.Value); options.LoginPath = config.LoginPath; options.LogoutPath = config.LogoutPath; options.AccessDeniedPath = config.AccessDeniedPath; options.ReturnUrlParameter = config.ReturnUrlParameter !; options.SlidingExpiration = config.SlidingExpiration !.Value; // options.EventsType = typeof(CustomCookieAuthenticationEvents); }); var authenticationService = services.ToService <IAuthenticationService>(); if (!services.ToExists <IHttpContextAccessor>()) { services.AddHttpContextAccessor(); } var httpContextAccessor = services.ToService <IHttpContextAccessor>(); // services.AddScoped<CustomCookieAuthenticationEvents>(); services.TryAddSingleton <ICookiesService>(new CookiesService(config, authenticationService !, httpContextAccessor !)); } return(services); }
/// <summary> /// Inicializa una nueva instancia de la clase <see cref="CookiesService"/>. /// </summary> /// <param name="settings">Configuración de la autenticación.</param> /// <param name="authenticationService">Servicio para autenticarse.</param> /// <param name="httpContextAccessor">Servicio para acceder al cotexto.</param> public CookiesService(CookiesSettings settings, IAuthenticationService authenticationService, IHttpContextAccessor httpContextAccessor) { CookiesSettings = settings; AuthenticationService = authenticationService; HttpContextAccessor = httpContextAccessor; }