¿Cómo establecer tiempos de expiración de cookies para el servidor de identidad, web api y aplicación de cliente?
Soy nuevo en Identity Server y sé muy poco sobre la gestión de cookies. He configurado una Web API y una aplicación cliente con IDS4. A continuación, se muestra mi archivo startup.cs en Identity Server.
public void ConfigureServices(IServiceCollection services)
{
//...
var builder = services.AddIdentityServer(options =>
{
options.EmitStaticAudienceClaim = true;
options.IssuerUri = "https://localhost:5001";
})
//...
}
Y aquí está mi método de extensión para agregar autenticación en la Web API
public static void AddCustomAuthentication(this IServiceCollection services, IConfiguration Configuration)
{
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
// indicar la dirección base del servidor de identidad
options.Authority = Configuration["IdentityServerUri"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
}
Y aquí está mi método de extensión para agregar autenticación en la aplicación cliente,
public static void AddCustomAuthentication(this IServiceCollection services, IConfiguration Configuration)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie(options =>
{
options.Cookie.Name = "CorpLense.HR.WebClient";
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = Configuration["IdentityServerUri"];
options.SignInScheme = "Cookies";
options.ClientId = "CorpLense.HR.WebClient";
options.ClientSecret = "***";
options.ResponseType = "code";
options.SaveTokens = true;
// obtener los reclamos
// solicitar acceso a los ámbitos
});
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
}
Y a continuación se muestra una captura de pantalla de las cookies.
OBSERVACIONES
He notado que mi aplicación cliente permanece conectada todo el tiempo. No me pide iniciar sesión incluso al día siguiente. Sin embargo, después de algunas horas, mi Web API arroja códigos de respuesta NO AUTORIZADO. Y cuando cierro sesión e ingreso de nuevo desde mi aplicación cliente, la API comienza a funcionar correctamente de nuevo. Algo me dice que tal vez el token de portador está caducado.
OBJETIVO
Sólo quiero saber cómo tener un control total sobre las cookies. Quiero que la aplicación cliente cierre automáticamente la sesión cuando expire la cookie en el lado del servidor, o la cookie en el lado del Web API, o la cookie en la aplicación cliente. También quiero saber cómo controlar los tiempos de expiración de las cookies y cómo actualizar los tokens de portador si caducan.
davy.ai
En primer lugar, es importante entender que las cookies se utilizan para gestionar la sesión del usuario y mantener su estado de autenticación. En su caso, la aplicación cliente está utilizando una cookie para mantener la sesión del usuario y la API web está utilizando un token de portador que es emitido por el servidor de identidad para autenticar al usuario en las solicitudes posteriores.
Para responder a su primera pregunta, para tener un control total sobre las cookies, puede establecer las opciones de la cookie en el método AddCookie al configurar el middleware de autenticación en la aplicación cliente. Las siguientes opciones se pueden utilizar para controlar el tiempo de expiración de la cookie, la expiración deslizante y otras propiedades:
Por ejemplo, para establecer el tiempo de expiración de la cookie a 1 hora, puede modificar su método AddCustomAuthentication de la siguiente manera:
Para actualizar el token de portador cuando expire, puede utilizar el mecanismo de token de actualización proporcionado por IdentityServer4. Cuando expire el token de acceso, la aplicación cliente puede utilizar el token de actualización para obtener un nuevo token de acceso sin solicitar al usuario que vuelva a introducir sus credenciales. Para habilitar el mecanismo de token de actualización, debe hacer lo siguiente:
Por ejemplo, puede modificar su método AddCustomAuthentication de la siguiente manera:
Para desconectar al usuario cuando expire la cookie en el lado del servidor o en el lado de la API web, puede utilizar algún mecanismo para comprobar periódicamente si la cookie es válida. Puede hacerlo mediante el uso de un middleware o programador que comprueba las expiraciones de las cookies y desconecta al usuario si es necesario. Sin embargo, esto puede no ser una solución fiable ya que la cookie se almacena en el navegador del usuario y puede ser modificada o eliminada por este último. En general, se recomienda establecer un tiempo de expiración razonable para la cookie, tener una expiración deslizante y utilizar conexiones HTTP seguras.
En resumen, para tener un control total sobre las cookies, puede establecer las opciones de la cookie en el método AddCookie en el middleware de autenticación de la aplicación cliente. Para actualizar el token de portador cuando expire, puede utilizar el mecanismo de token de actualización proporcionado por IdentityServer4. Para desconectar al usuario cuando expire la cookie en el lado del servidor o en el lado de la API web, puede utilizar algún mecanismo para comprobar periódicamente si la cookie es válida, pero esto puede no ser una solución fiable.