Compartir a través de


Autenticación remota

La característica de autenticación remota de los adaptadores System.Web permite a una aplicación de ASP.NET Core determinar la identidad de un usuario (autenticar una solicitud HTTP) remitiéndose a una aplicación ASP.NET. Al habilitar la característica, se agrega un punto de conexión a la aplicación de ASP.NET que devuelve un serializado ClaimsPrincipal que representa al usuario autenticado para las solicitudes realizadas al punto de conexión. La aplicación ASP.NET Core, a continuación, registra un controlador de autenticación personalizado que (para los puntos de conexión con autenticación remota habilitada) determina la identidad de un usuario llamando a ese punto de conexión en la aplicación ASP.NET y pasando encabezados seleccionados y cookies de la solicitud original recibida por la aplicación ASP.NET Core.

Configuración

Solo hacen falta algunos pequeños cambios de código para habilitar la autenticación remota en una solución que ya está configurada según la Introducción.

En primer lugar, siga las instrucciones de configuración de la aplicación remota para conectar las aplicaciones de ASP.NET Core y ASP.NET. A continuación, solo hay un par de métodos de extensión adicionales a los que llamar para habilitar la autenticación remota de la aplicación.

Configuración de la aplicación ASP.NET

La aplicación ASP.NET debe configurarse para agregar el punto de conexión de autenticación. Para agregar el punto de conexión de autenticación, se llama al método de extensión AddAuthenticationServer para configurar el módulo HTTP que supervisa las solicitudes al punto de conexión de autenticación. Tenga en cuenta que los escenarios de autenticación remota suelen querer agregar compatibilidad con proxy, de modo que los redireccionamientos relacionados con la autenticación se enrutarán correctamente a la aplicación ASP.NET Core en lugar de a la ASP.NET.

SystemWebAdapterConfiguration.AddSystemWebAdapters(this)
    .AddProxySupport(options => options.UseForwardedHeaders = true)
    .AddRemoteAppServer(options =>
    {
        options.ApiKey = ConfigurationManager.AppSettings["RemoteAppApiKey"];
    })
    .AddAuthenticationServer();

Configuración de la aplicación ASP.NET Core

A continuación, la aplicación ASP.NET Core debe configurarse para habilitar el controlador de autenticación que autenticará a los usuarios mediante una solicitud HTTP a la aplicación ASP.NET. De nuevo, esto se realiza mediante una llamada AddAuthenticationClient al registro de servicios de adaptadores System.Web:

builder.Services.AddSystemWebAdapters()
    .AddRemoteAppClient(options =>
    {
        options.RemoteAppUrl = new Uri(builder.Configuration
            ["ReverseProxy:Clusters:fallbackCluster:Destinations:fallbackApp:Address"]);
        options.ApiKey = builder.Configuration["RemoteAppApiKey"];
    })
    .AddAuthenticationClient(true);

El valor booleano que se pasa a la llamada AddAuthenticationClient especifica si la autenticación remota de la aplicación debe ser el esquema de autenticación predeterminado. Pasar true hará que el usuario se autentique a través de la autenticación remota de la aplicación para todas las solicitudes, mientras que pasar false significa que el usuario solo se autenticará con la autenticación de aplicación remota si se solicita específicamente el esquema de aplicación remota (con [Authorize(AuthenticationSchemes = RemoteAppAuthenticationDefaults.AuthenticationScheme)] en un controlador o método de acción, por ejemplo). Pasar false para este parámetro tiene la ventaja de realizar solo solicitudes HTTP a la aplicación de ASP.NET original para la autenticación para puntos de conexión que requieren autenticación de aplicaciones remotas, pero tiene la desventaja de requerir anotar todos estos puntos de conexión para indicar que usarán la autenticación de la aplicación remota.

Además de requerir un valor booleano, se puede pasar una devolución de llamada opcional a AddAuthenticationClient para modificar algunos otros aspectos del comportamiento del proceso de autenticación remota:

  • RequestHeadersToForward: esta propiedad contiene encabezados que se deben reenviar desde una solicitud al llamar a la API de autenticación. De forma predeterminada, los únicos encabezados reenviados son Authorization y Cookie. Se pueden reenviar encabezados adicionales agregándolos a esta lista. Como alternativa, si la lista está desactivada (para que no se especifique ningún encabezado), se reenviarán todos los encabezados.
  • ResponseHeadersToForward: esta propiedad enumera los encabezados de respuesta que se deben propagar desde la solicitud de autenticación a la llamada original que solicitó la autenticación en escenarios en los que se impugna la identidad. De forma predeterminada, esto incluye los encabezados Location, Set-Cookiey WWW-Authenticate.
  • AuthenticationEndpointPath: el punto de conexión de la aplicación ASP.NET donde se deben realizar solicitudes de autenticación. Este valor predeterminado es /systemweb-adapters/authenticate y debe coincidir con el punto de conexión especificado en la configuración del punto de conexión de autenticación de ASP.NET.

Por último, si la aplicación ASP.NET Core no incluía previamente el middleware de autenticación, deberá habilitarse (después del middleware de enrutamiento, pero antes del middleware de autorización):

app.UseAuthentication();

Diseño

  1. Cuando la aplicación ASP.NET Core procesa las solicitudes, si la autenticación de la aplicación remota es el esquema predeterminado o especificado por el punto de conexión de la solicitud, RemoteAuthenticationAuthHandler intentará autenticar al usuario.
    1. El controlador realizará una solicitud HTTP al punto de conexión de autenticación de la aplicación ASP.NET. Copiará los encabezados configurados de la solicitud actual en este nuevo para reenviar los datos relevantes para la autenticación. Como se mencionó anteriormente, el comportamiento predeterminado es copiar los encabezados Authorize y Cookie. El encabezado clave de API también se agrega con fines de seguridad.
  2. La aplicación ASP.NET atenderá las solicitudes enviadas al punto de conexión de autenticación. Siempre que coincidan las claves de API, la aplicación ASP.NET devolverá el serializado del usuario actual ClaimsPrincipal en el cuerpo de la respuesta o devolverá un código de estado HTTP (como 401 o 302) y encabezados de respuesta que indican un error.
  3. Cuando el RemoteAuthenticationAuthHandler de la aplicación ASP.NET Core recibe la respuesta de la aplicación ASP.NET:
    1. Si ClaimsPrincipal se devolvió correctamente, el controlador de autenticación lo deserializará y lo usará como identidad del usuario actual.
    2. Si ClaimsPrincipal no se devolvió correctamente, el controlador almacenará el resultado y, si se impugna la autenticación (porque el usuario accede a un recurso protegido, por ejemplo), la respuesta de la solicitud se actualizará con el código de estado y los encabezados de respuesta seleccionados de la respuesta del punto de conexión de autenticación. Esto permite que las respuestas de desafío (como redireccionamientos a una página de inicio de sesión) se propaguen a los usuarios finales.
      1. Dado que los resultados del punto de conexión de autenticación de la aplicación ASP.NET pueden incluir datos específicos de ese punto de conexión, los usuarios pueden registrar implementaciones IRemoteAuthenticationResultProcessor con la aplicación ASP.NET Core que se ejecutará en los resultados de autenticación antes de que se usen. Por ejemplo, el integrado IRemoteAuthenticationResultProcessor es RedirectUrlProcessor el que busca encabezados de respuesta Location devueltos desde el punto de conexión autenticado y garantiza que redirijan de nuevo al host de la aplicación ASP.NET Core y no a la aplicación ASP.NET directamente.

Restricciones conocidas

Este enfoque de autenticación remota tiene un par de limitaciones conocidas:

  1. Dado que la autenticación de Windows depende de un controlador de una identidad de Windows, esta característica no admite autenticación de Windows. Se planea un trabajo futuro para explorar cómo compartir las autenticaciones de Windows. Consulte dotnet/systemweb-adapters#246 para obtener más información.
  2. Esta característica permite que la aplicación ASP.NET Core use una identidad autenticada por la aplicación ASP.NET, pero todas las acciones relacionadas con los usuarios (iniciar sesión, cerrar sesión, etc.) todavía deben enrutarse a través de la aplicación ASP.NET.

Alternativas

Si la autenticación en la aplicación ASP.NET se realiza mediante el middleware de autenticaciónvMicrosoft.OwinCookie, una solución alternativa para compartir la identidad consiste en configurar las aplicaciones ASP.NET y ASP.NET Core para que puedan compartir una autenticación cookie. El uso compartido de una autenticación cookie habilita:

  • Ambas aplicaciones para determinar la identidad de usuario de la misma cookie.
  • Al iniciar sesión o salir de una aplicación, el usuario inicia o sale de la otra.

Tenga en cuenta que, dado que el inicio de sesión normalmente depende de una base de datos específica, no toda la funcionalidad de la autenticación funcionará en ambas aplicaciones:

  • Los usuarios deben iniciar sesión solo a través de una de las aplicaciones, ya sea la aplicación ASP.NET o ASP.NET Core, con la que esté configurada la base de datos para que funcione.
  • Ambas aplicaciones pueden ver la identidad y las notificaciones de los usuarios.
  • Ambas aplicaciones pueden cerrar la sesión del usuario.

Los detalles sobre cómo configurar la autenticación cookie de uso compartido entre las aplicaciones ASP.NET y ASP.NET Core están disponibles en la documentación de uso compartido cookie. En los ejemplos siguientes del repositorio de GitHub de adaptadores System.Web se muestra la autenticación de aplicaciones remotas con la configuración compartida cookie , lo que permite a ambas aplicaciones iniciar y cerrar la sesión de los usuarios:

La autenticación de uso compartido es una buena opción si se cumplen ambas condiciones:

  • La aplicación ASP.NET ya usa la autenticación Microsoft.Owincookie.
  • Es posible actualizar las aplicaciones ASP.NET y ASP.NET Core para usar la configuración de protección de datos coincidente. La configuración de protección de datos compartida coincidente incluye una ruta de acceso de archivo compartida, Redis caché o Azure Blob Storage para almacenar las claves de protección de datos.

En otros escenarios, el enfoque de autenticación remota descrito anteriormente en este documento es más flexible y probablemente sea una mejor opción.