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.

Forzar inicio de sesión después de cerrar sesión con OpenID Connect y establecer la duración de la cookie en Blazor (.Net 6)

Estoy usando Blazor con .Net 6 Server y tengo problemas con el cierre de sesión y las cookies después de la autenticación con OpenID Connect para ADFS.

El primer inicio de sesión funciona perfectamente (veo la página de ADFS). El problema surge cuando el usuario cierra la sesión, con una página personalizada para hacerlo; si el usuario intenta acceder a una página protegida después del cierre de sesión, puede acceder de nuevo sin tener que hacerlo. Durante unos segundos, en la barra de direcciones, se muestra la llamada a ADFS y luego se da la autenticación, pero sin mostrar ningún formulario de nombre de usuario o contraseña. ¿Cómo puedo obligar a los usuarios a iniciar sesión en ADFS cada vez después del cierre de sesión?

Para esta configuración, seguí este ejemplo: Blazor OpenID-Connect.

Otra cosa es el tiempo de vida de las cookies. Probé algunas soluciones en el método .AddCookie(), pero sin éxito. ¿Cómo puedo configurar correctamente el tiempo de vida de las cookies (10 minutos)?

La última pregunta es sobre /.well-known/openid-configuration. Antes de cambiar del Duende Identity Server a esta solución sencilla (código debajo), no podía acceder a este punto final. ¿Por qué?

Archivo Setup.cs:

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddAuthentication(opt =>
   {
     opt.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
     opt.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
     opt.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
   })
     .AddCookie()
     .AddOpenIdConnect("oidc", options =>
     {
       options.Authority = "https://adfs......./adfs";
       options.ClientId = "<mi-id>";
       options.ClientSecret = "<mi-secreto>";

       options.SignInScheme = "Cookies";
       options.RequireHttpsMetadata = false;

       options.ResponseType = "id_token";
       options.SaveTokens = true;
       options.GetClaimsFromUserInfoEndpoint = true;

       options.UseTokenLifetime = false;

       options.Scope.Add("openid");
       options.Scope.Add("profile");
       options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" };
       options.Events = new OpenIdConnectEvents
       {
         OnAccessDenied = context =>
         {
           context.HandleResponse();
           context.Response.Redirect("/");
           return Task.CompletedTask;
         }
       };
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  ...
  app.UseAuthentication();
  app.UseAuthorization();
}

Archivo Logout.cshtml:

“`
@page
@model Service.Pages.LogoutModel
@{
}

Archivo Logout.cshtml.cs:

namespace Service.Pages
{
public class LogoutModel : PageModel
{
public async Task<iactionresult> OnGetAsync()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
return Redirect("/");
}
}
}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución de problemas del cierre de sesión y cookies en Blazor con OpenID Connect a ADFS

    Si tiene problemas con el cierre de sesión y las cookies al usar Blazor con .NET 6 Server y OpenID Connect a ADFS, hay algunas cosas que puede probar.

    Forzar a los usuarios a iniciar sesión en ADFS después del cierre de sesión

    Si los usuarios pueden acceder a las páginas protegidas sin volver a iniciar sesión después de cerrar la sesión, es posible que deba cambiar la configuración para obligar a los usuarios a volver a autenticarse con ADFS.

    Una solución es establecer la opción UseTokenLifetime en true en la configuración de OpenID Connect, como se indica a continuación:

    options.UseTokenLifetime = true;
    

    Esto garantizará que la cookie de autenticación se borre correctamente cuando el usuario cierra sesión.

    Otra opción es agregar una cabecera de control de caché a la respuesta de cierre de sesión, lo que evitará que el navegador almacene en caché la página y permitirá que aparezca de nuevo la página de inicio de sesión de ADFS cuando el usuario intente acceder a una página protegida después de cerrar la sesión. Puede hacer esto agregando el siguiente código a su archivo Logout.cshtml.cs:

    public async Task<iactionresult> OnGetAsync()
    {
        // Cerrar sesión de todos los esquemas de autenticación
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        await HttpContext.SignOutAsync("Cookies");
        await HttpContext.SignOutAsync("oidc");
    
        // Agregar una cabecera de control de caché para evitar el almacenamiento en caché de la página
        Response.Headers.Append("Cache-Control", "no-cache, no-store, must-revalidate");
    
        return Redirect("/");
    }
    

    Establecer la duración de las cookies

    Para establecer la duración de sus cookies en 10 minutos, puede agregar el siguiente código a su método ConfigureServices:

    services.Configure<cookieauthenticationoptions>(CookieAuthenticationDefaults.AuthenticationScheme, options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromMinutes(10);
        options.SlidingExpiration = true;
    });
    

    Esto establecerá el tiempo de expiración de la cookie en 10 minutos y habilitará la expiración deslizante para que la cookie se renueve cada vez que el usuario interactúe con la aplicación.

    Acceder al punto final /.well-known/openid-configuration

    Si no pudo acceder al punto final /.well-known/openid-configuration antes de cambiar de Duende Identity Server a su solución actual, es posible que la configuración no se haya configurado correctamente. Debe asegurarse de que la autoridad y la configuración del ID de cliente sean correctas en su configuración de OpenID Connect.

    options.Authority = "https://adfs......./adfs";
    options.ClientId = "<mi_id>";
    

    Además, es posible que deba verificar la configuración del servidor ADFS para asegurarse de que el punto final de OpenID Connect esté configurado y configurado correctamente.

Comments are closed.