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.

Aparece una ventana de autenticación de Windows después de autenticarse a través de ADFS en una aplicación de formularios web de C#/.NET.

Recientemente actualicé una aplicación heredada de C#.NET WebForms versión 4.5 para utilizar ADFS para la autenticación, pero de alguna manera solo funciona si también tengo habilitada la autenticación de Windows en IIS. Cuando tengo habilitada la autenticación de Windows, después de que un usuario inicia sesión en nuestro servidor ADFS, aparece una ventana emergente de autenticación de Windows que requiere que el usuario inicie sesión dos veces. Ese no es el resultado que deseaba, así que desactivé la autenticación de Windows con la esperanza de que desapareciera el segundo inicio de sesión, pero ahora después de iniciar sesión en ADFS, el usuario recibe un error de 401 No autorizado.

Si tengo que mantener habilitada la autenticación de Windows para que esta aplicación heredada inicie sesión correctamente, ¿hay algo que deba agregar al código para evitar que aparezca la ventana emergente de autenticación de Windows después de que un usuario inicie sesión en ADFS?

Startup.Auth.cs

public partial class Startup
{
    private static string realm = ConfigurationManager.AppSettings["ida:Wtrealm"];
    private static string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"];

    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {
                Wtrealm = realm,
                MetadataAddress = adfsMetadata
            });

        // Esto hace que cualquier middleware definido antes de esta línea se ejecute antes de que se aplique la regla de autorización en web.config
        app.UseStageMarker(PipelineStage.Authenticate);
    }
}

Startup.cs

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }
}

ACTUALIZACIÓN: Acabo de confirmar que mi sitio de desarrollo funciona correctamente, lo que significa que la ventana emergente de autenticación de Windows NO SE muestra después de autenticarse con ADFS. Tiene el mismo código, la misma configuración web.config, la misma configuración en IIS en el servidor de desarrollo en comparación con el de producción, y la misma configuración en el servidor de ADFS. La ÚNICA diferencia que puedo ver es que el servidor de producción es Windows Server 2019 Datacenter y el servidor de desarrollo es Windows Server 2012 R2.

¿Existen diferencias entre estos 2 servidores que harían que aparezca la ventana de autenticación de Windows después de la autenticación de ADFS? ¿Podría ser que la aplicación heredada solo funcione en un servidor heredado y no en uno más nuevo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Dado que el problema no se puede reproducir en el entorno de desarrollo, es posible que el problema esté relacionado con la versión del sistema operativo. Por lo tanto, se recomienda verificar si la versión de IIS y la configuración son iguales en ambos servidores.

    Suponiendo que la configuración de IIS es la misma en ambos servidores, es posible que el problema esté relacionado con el orden en el que se están utilizando los middlewares de autenticación. El middleware de autenticación de cookies debe ser utilizado antes del middleware de WS-Federation. Por lo tanto, actualice el método ConfigureAuth en Startup.Auth.cs de la siguiente manera:

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
    
        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {
                Wtrealm = realm,
                MetadataAddress = adfsMetadata
            });
    
        // Esto hace que cualquier middleware definido antes de esta línea se ejecute antes de que se aplique la regla de autorización en web.config
        app.UseStageMarker(PipelineStage.Authenticate);
    }
    

    Además, verifique si la configuración de autenticación adecuada está configurada en el archivo web.config de la aplicación. Asegúrese de que el elemento authentication esté configurado como Forms y el atributo mode esté configurado como None.

    <authentication mode="None">
        <forms loginurl="~/Account/Login.aspx" timeout="2880"></forms>
    </authentication>
    

    Si el problema persiste, configure una nueva aplicación de prueba con una configuración similar y compare los resultados entre las dos.

Comments are closed.