Compartir a través de


Autenticación de usuarios con WS-Federation en ASP.NET Core

Nota

Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión de .NET 9 de este artículo.

Advertencia

Esta versión de ASP.NET Core ya no se admite. Para obtener más información, consulte la política de soporte de .NET y .NET Core. Para la versión actual, consulte la versión de .NET 9 de este artículo.

Importante

Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no ofrece ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Para la versión actual, consulte la versión de .NET 9 de este artículo.

En este tutorial se muestra cómo permitir que los usuarios inicien sesión con un proveedor de autenticación WS-Federation como Servicios de federación de Active Directory (ADFS) o Microsoft Entra ID. Usa la aplicación de ejemplo ASP.NET Core descrita en Autenticación de Facebook, Google y proveedor externo.

Para las aplicaciones de ASP.NET Core, Microsoft.AspNetCore.Authentication.WsFederation proporciona compatibilidad con WS-Federation. Este componente se porta desde Microsoft.Owin.Security.WsFederation y comparte muchos de los mecanismos de ese componente. Sin embargo, los componentes difieren en un par de aspectos importantes.

De forma predeterminada, el nuevo middleware:

  • No permite inicios de sesión no solicitados. Esta característica del protocolo WS-Federation es vulnerable a ataques XSRF. Sin embargo, se puede habilitar con la opción AllowUnsolicitedLogins.
  • No comprueba todas las publicaciones de formulario para los mensajes de inicio de sesión. Solo se comprueban las solicitudes a CallbackPath para los inicios de sesión. El valor predeterminado de CallbackPath es /signin-wsfed, pero se puede cambiar a través de la propiedad heredada RemoteAuthenticationOptions.CallbackPath de la clase WsFederationOptions. Esta ruta de acceso se puede compartir con otros proveedores de autenticación habilitando la opción SkipUnrecognizedRequests.

Registro de la aplicación con Active Directory

Servicios de federación de Active Directory

  • Abra el Asistente para agregar relación de confianza para usuario autenticado del servidor desde la consola de administración de ADFS:

Asistente para agregar relación de confianza para usuario autenticado: Bienvenido

  • Elija escribir datos manualmente:

Asistente para agregar confianza para usuario de confianza: seleccionar origen de datos

  • Escriba un nombre para mostrar para el usuario de confianza. El nombre no es importante para la aplicación ASP.NET Core.

  • Microsoft.AspNetCore.Authentication.WsFederation no admite el cifrado de tokens, por lo que no debe configurar un certificado de cifrado de tokens:

Asistente para agregar confianza para usuario de confianza: configurar certificado

  • Habilite la compatibilidad con el protocolo WS-Federation Passive mediante la dirección URL de la aplicación. Compruebe que el puerto es correcto para la aplicación:

Asistente para agregar relación de confianza para usuario autenticado: Configurar URL

Nota

Debe ser una dirección URL HTTPS. IIS Express puede proporcionar un certificado autofirmado al hospedar la aplicación durante el desarrollo. Kestrel requiere la configuración manual del certificado. Consulte la Kestreldocumentación para más detalles.

  • Haga clic en Siguiente a través del resto del asistente y en Cerrar al final.

  • ASP.NET Core Identity requiere una notificación de Id. de nombre. Agregue una desde el cuadro de diálogo Editar reglas de notificación:

Edición de reglas de notificación

  • En el Asistente para agregar reglas de notificación de transformación, deje seleccionada la plantilla Enviar atributos LDAP predeterminados como notificaciones y haga clic en Siguiente. Agregue una regla que asigne el atributo LDAP SAM-Account-Name a la notificación saliente de Id. de nombre:

Asistente para agregar reglas de notificación de transformación: configurar regla de notificación

  • Haga clic en Finalizar>Aceptar en la ventana Editar reglas de notificación.

Microsoft Entra ID

  • Vaya a la hoja de registros de aplicaciones del inquilino de Microsoft Entra ID. Haga clic en Nuevo registro de aplicaciones:

Microsoft Entra ID: registros de aplicaciones

  • Escriba un nombre para el registro de aplicación. Esto no es importante para la aplicación ASP.NET Core.
  • Escriba la dirección URL en la que escucha la aplicación como dirección URL de inicio de sesión:

Microsoft Entra ID: Crear registros de aplicaciones

  • Haga clic en Puntos de conexión y anote la dirección URL del Documento de metadatos de federación. Esta es la MetadataAddress del middleware de WS-Federation:

Microsoft Entra ID: puntos de conexión

  • Vaya al nuevo registro de aplicaciones. Haga clic en Exponer una API. Para el URI del id. de aplicación, haga clic en Establecer>Guardar. Anote el URI del id. de aplicación. Esta es la Wtrealm del middleware de WS-Federation:

Microsoft Entra ID: propiedades de registro de aplicaciones

Uso de WS-Federation sin ASP.NET Core Identity

El middleware de WS-Federation se puede usar sin Identity. Por ejemplo:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
    })
     .AddWsFederation(options =>
     {
         options.Wtrealm = Configuration["wsfed:realm"];
         options.MetadataAddress = Configuration["wsfed:metadata"];
     })
     .AddCookie();

    services.AddControllersWithViews();
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapRazorPages();
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
    })
    .AddWsFederation(options =>
    {
        options.Wtrealm = Configuration["wsfed:realm"];
        options.MetadataAddress = Configuration["wsfed:metadata"];
    })
    .AddCookie();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Agregue WS-Federation como proveedor de inicio de sesión externo para ASP.NET Core Identity

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();


    services.AddAuthentication()
        .AddWsFederation(options =>
        {
            // MetadataAddress represents the Active Directory instance used to authenticate users.
            options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";

            // Wtrealm is the app's identifier in the Active Directory instance.
            // For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
            options.Wtrealm = "https://localhost:44307/";

            // For AAD, use the Application ID URI from the app registration's Overview blade:
            options.Wtrealm = "api://bbd35166-7c13-49f3-8041-9551f2847b69";
        });

    services.AddControllersWithViews();
    services.AddRazorPages();
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddAuthentication()
        .AddWsFederation(options =>
        {
            // MetadataAddress represents the Active Directory instance used to authenticate users.
            options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";

            // Wtrealm is the app's identifier in the Active Directory instance.
            // For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
            options.Wtrealm = "https://localhost:44307/";

            // For AAD, use the Application ID URI from the app registration's Overview blade:
            options.Wtrealm = "api://bbd35166-7c13-49f3-8041-9551f2847b69";
        });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

La sobrecarga de AddAuthentication(IServiceCollection, String) establece la propiedad DefaultScheme. La sobrecarga de AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) permite configurar las opciones de autenticación, que se pueden usar para configurar esquemas de autenticación predeterminados con distintos fines. Las llamadas posteriores a AddAuthentication invalidan las propiedades AuthenticationOptions previamente configuradas.

Los métodos de extensión de AuthenticationBuilder que registran un controlador de autenticación solo se pueden llamar una vez por esquema de autenticación. Existen sobrecargas que permiten configurar las propiedades del esquema, el nombre del esquema y el nombre para mostrar.

Inicio de sesión con WS-Federation

Vaya a la aplicación y haga clic en el vínculo Iniciar sesión en el encabezado de navegación. Hay una opción para iniciar sesión con WsFederation:

Página Iniciar sesión

Con ADFS como proveedor, el botón redirige a una página de inicio de sesión de ADFS:

Página de inicio de sesión de ADFS

Con microsoft Entra ID como proveedor, el botón redirige a una página de inicio de sesión de Microsoft Entra ID:

Página de inicio de sesión de Microsoft Entra ID

Un inicio de sesión correcto para un nuevo usuario redirige a la página de registro de usuarios de la aplicación:

Página Registrar