Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 deCallbackPath
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:
- Elija escribir datos manualmente:
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:
- 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:
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:
- 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:
- 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:
- 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:
- 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:
- 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:
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
Agregue una dependencia de Microsoft.AspNetCore.Authentication.WsFederation al proyecto.
Agregue WS-Federation a
Startup.ConfigureServices
:
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:
Con ADFS como proveedor, el botón redirige a una 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:
Un inicio de sesión correcto para un nuevo usuario redirige a la página de registro de usuarios de la aplicación: