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.

Agregar una política de autorización interrumpe la devolución de la URL de retorno predeterminada/scaffolded Identity en la aplicación web ASP.NET 6.

Estoy enfrentando un problema en el que la URL de retorno no se está formateando correctamente después de agregar una política de autorización a mi archivo Program.cs de la aplicación web ASP.NET 6.

Pasos para reproducir el problema:
1. Crear una aplicación web ASP.NET 6 con cuentas individuales.
2. Crear una base de datos en SQL Server y actualizar la cadena de conexión en el archivo appsettings.json.
3. Ejecutar el comando Update-Database para crear las tablas predeterminadas de ASP.NET Identity.
4. Generar todas las páginas de identidad utilizando la clase ApplicationDbContext y IdentityUser predeterminadas.

En este punto, todo funciona como debería. Puedo registrar un nuevo usuario e iniciar sesión.

  1. Agregar una política de autorización a program.cs para requerir que el usuario haya iniciado sesión para acceder a la aplicación.


builder.Services.AddAuthorization(options => {
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});

En este punto, al iniciar la aplicación, se redirige a una URL incorrecta:

(en MS Edge)
Hmmm … no se puede acceder a esta página
Parece que la página web en https://localhost:7094/Identity/Account/Login?ReturnUrl=%2FIdentity%2FAccount%2FLogin%3FReturnUrl%3D%252FIdentity%252FAccount%252FLogin%253FReturnUrl%253D%25252FIdentity…….etc

La URL se repite infinitamente con más ‘%25F’ cada vez que se repite.

Agregar [AllowAnonymous] a las páginas de inicio de sesión y registro me permite acceder a ellas, pero aún así no puedo registrarme correctamente como nuevo usuario. Después del registro, al hacer clic en el enlace ‘En circunstancias normales, se enviaría por correo electrónico: Haga clic aquí para confirmar su cuenta’, se me redirige a una URL similarmente incorrecta:

https://localhost:7094/Identity/Account/Login?ReturnUrl=%2FIdentity%2FAccount%2FConfirmEmail%3FuserId%3Def48b287-bac4-4b21-afbc-f060e1ba859d%26code%3DQ2ZESjhBS2tOazZqZ1IxSWl3NVdudEJhSUhLckxsY2NMZytON1JSaVlPYkRLOE50ako2THFWOXRIZ2UzVFB4VmxFZ0JUYWQ0djg2TXNLcVpyS3c2VndEcUtNdG5DdkNBdzhnak95TUQ4U25nSTltU2cvRzNzMUt5ZHgvNGd6WjhFdnlYUy85RmMzU2g0VHY3WURhOHl0TVJPay8wbGI1b0JFV3hWcEZNYkQ1S2Q5U1VuNEh6ZlZkOEIrOWFEdGxYQVBWR2hIZjVnaENLditwSjJaWUoyMHNWOHp3VzVIanJ4cnh0NEEwUTNHdjZNNlEyRC9ZdUVORmZZOXM3NVZjeWtvcHIrUT09%26returnUrl%3D%252FIdentity%252FAccount%252FLogout

Esto hace que la columna EmailConfirmed en la base de datos no se establezca en Verdadero y no puedo iniciar sesión como el usuario creado.

¿Alguien tiene alguna idea de qué podría estar causando que la URL se formatee de esta manera? El código de autorización mencionado anteriormente es el único código que agregué al proyecto yo mismo, todo lo demás es predeterminado/generado automáticamente.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema con ReturnUrl después de agregar una política de autorización en una aplicación web ASP.NET 6

    Descripción del problema

    El problema encontrado es que el ReturnUrl no se está formateando correctamente después de agregar una política de autorización en el archivo Program.cs de una aplicación web ASP.NET 6. Al iniciar la aplicación, esto resulta en ser llevado a una URL rota que se repite infinitamente con más ‘%25F’ añadidos cada vez que hace un bucle.

    Pasos para reproducir

    Para reproducir el problema, siga estos pasos:

    1. Cree una aplicación web ASP.NET 6 con cuentas individuales.
    2. Cree una base de datos de SQL Server y actualice la cadena de conexión en appsettings.json.
    3. Ejecute el comando Update-Database para crear las tablas de Identity predeterminadas de ASP.NET.
    4. Genere todas las páginas de Identity utilizando el ApplicationDbContext y el IdentityUser predeterminados.
    5. Agregue una política de autorización al archivo Program.cs para requerir que un usuario haya iniciado sesión para acceder a la aplicación.
    builder.Services.AddAuthorization(options => {
        options.FallbackPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
    });
    

    Síntomas

    Después de seguir los pasos anteriores, al iniciar la aplicación, esto resulta en ser llevado a una URL rota. Además, si se agrega [AllowAnonymous] a las páginas de inicio de sesión y registro, aún no es posible registrar correctamente un nuevo usuario. Después de registrarse, hacer clic en el enlace ‘Por lo general, esto se enviaría por correo electrónico: Haz clic aquí para confirmar tu cuenta’ lleva al usuario a una URL igualmente rota. Esto hace que la columna EmailConfirmed en la base de datos no se establezca en True y el usuario no puede iniciar sesión como el usuario creado.

    Solución

    El problema es causado por un error en la autenticación de ASP.NET 6.0. Se ha encontrado una solución mediante la adición del siguiente código al archivo Startup.cs dentro del método configure, después de la línea UseAuthentication();.

    app.Use(async (context, next) => {
        await next();
        if (context.Response.StatusCode == 401)
        {
            context.Response.Redirect("/Identity/Account/Login");
        }
    });
    

    Este código verifica el código de estado 401 y redirige al usuario a la página de inicio de sesión si se encuentra.

    Agregar este código resuelve el problema con el ReturnUrl que no se está formateando correctamente después de agregar una política de autorización en el archivo Program.cs de una aplicación web ASP.NET 6.

    Conclusión

    ASP.NET 6.0 tiene un problema conocido con el ReturnUrl que no se está formateando correctamente después de agregar una política de autorización. La solución es agregar el código proporcionado anteriormente al archivo Startup.cs, el cual verifica el código de estado 401 y redirige al usuario a la página de inicio de sesión si se encuentra.

Comments are closed.