es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

enter image description here

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.

Tags:  

Answer

  1. Avatar for 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:

    • Cookie.Name: establece el nombre de la cookie. El nombre por defecto es “.AspNetCore.Cookies”.
    • Cookie.Expiration: establece el tiempo de expiración absoluto para la cookie. Después de este tiempo, la cookie se eliminará.
    • Cookie.SlidingExpiration: establece el tiempo de expiración deslizante para la cookie. Si el usuario está activo antes de que transcurra este tiempo, se ampliará el tiempo de expiración. De lo contrario, el usuario se desconectará.
    • Cookie.Path: establece la ruta de la cookie. La ruta por defecto es “/”.
    • Cookie.Domain: establece el dominio de la cookie.
    • Cookie.SecurePolicy: establece si la cookie requiere una conexión HTTPS. El valor por defecto es “SameAsRequest”.
    • Cookie.HttpOnly: establece si la cookie se puede acceder mediante scripts del lado del cliente. El valor por defecto es true.

    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:

    public static void AddCustomAuthentication(this IServiceCollection services, IConfiguration Configuration)
    {
        // ...
        .AddCookie(options =>
        {
            options.Cookie.Name = "CorpLense.HR.WebClient";
            options.Cookie.Expiration = TimeSpan.FromHours(1);
            options.Cookie.SlidingExpiration = true;
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromHours(1);
        })
        // ...
    }
    

    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:

    • Configure el servidor de identidad para que emita tokens de actualización. Esto se puede hacer estableciendo las propiedades RefreshTokenExpiration y RefreshTokenUsage en el método AddClient al configurar el cliente.
    • Solicite el ámbito “offline_access” en la configuración de OpenID Connect de la aplicación cliente añadiéndolo a la propiedad Scope.
    • Maneje el evento OnTokenValidated en el método AddOpenIdConnect y utilice la respuesta del token para solicitar un nuevo token de acceso y un token de actualización. Puede hacer esto estableciendo las propiedades TokenEndpoint y RefreshToken en el objeto AuthenticationProperties que se pasa al método RedirectUri.

    Por ejemplo, puede modificar su método AddCustomAuthentication de la siguiente manera:

    public static void AddCustomAuthentication(this IServiceCollection services, IConfiguration Configuration)
    {
        // ...
        .AddOpenIdConnect("oidc", options =>
        {
            // ...
            options.Scope.Add("offline_access"); // solicita acceso sin conexión
    
            // manejar el evento OnTokenValidated
            options.Events.OnTokenValidated = async ctx =>
            {
                // obtener el token de acceso y el token de actualización
                string accessToken = ctx.SecurityToken.RawData;
                string refreshToken = ctx.Properties.GetTokenValue("refresh_token");
    
                // intercambiar el token de actualización por un nuevo token de acceso y token de actualización
                TokenResponse tokenResponse = await ctx.HttpContext.GetTokenAsync("refresh_token", "oidc");
                if (tokenResponse != null)
                {
                    accessToken = tokenResponse.AccessToken;
                    refreshToken = tokenResponse.RefreshToken;
                }
    
                // actualizar los tokens en la cookie
                ctx.Properties.UpdateTokenValue("access_token", accessToken);
                ctx.Properties.UpdateTokenValue("refresh_token", refreshToken);
                ctx.ShouldRenew = true; // renovar la cookie
            };
        });
    
        // ...
    }
    

    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.

Comments are closed.