• +45 4949 9091
  • Soporte
  • Idiomas
    • Idiomas
    • English
    • Dansk
    • Svenska
    • Norsk
    • Deutsch
    • Nederlands
    • Polski
    • Français
    • Español
    • Italiano
    • Português
  • Registrarse
  • Iniciar sesión
Logo de FoxIDs
  • Plataforma
    • Despliegue
    • Multi-tenant
    • Lógica de identidad
    • Cumplimiento
  • Casos de uso
    • Resumen
    • Clientes
    • Empleados
    • Socios
    • Historias de clientes
  • Servicios
  • Precios
  • Docs y herramientas
    • Documentación
    • Artículos
    • Herramienta JWT
    • Herramienta SAML 2.0
    • Herramienta de certificados
  • Contáctanos
  • Registrarse
  • Iniciar sesión

ITfoxtec Identity SAML 2.0

El paquete open-source ITfoxtec Identity Saml2 añade soporte SAML 2.0 / SAML-P para aplicaciones .NET que necesitan actuar como Identity Provider (IdP), Service Provider (SP) o Relying Party (RP).

El paquete ITfoxtec Identity Saml2 resulta útil cuando SAML 2.0 debe implementarse directamente en la aplicación. Admite inicio de sesión, cierre de sesión y single logout mediante SAML 2.0, metadatos, Redirect Binding, POST Binding, Artifact Binding, firma y validación de mensajes, firmas ECDSA en versiones modernas compatibles de .NET, y cifrado y descifrado configurables de assertions.

El nombre de la empresa ITfoxtec ha cambiado a FoxIDs, pero los componentes mantendrán el nombre ITfoxtec como parte del nombre del componente por ahora.

Soporte

Haz preguntas en Stack Overflow y etiqueta con « itfoxtec-identity-saml2 ».

Para ayuda de implementación o asesoramiento de arquitectura, escriba a contact@foxids.com.

Paquete

Versiones NuGet ITfoxtec Identity SAML 2.0 NuGet ITfoxtec Identity SAML 2.0 MVC NuGet ITfoxtec Identity SAML 2.0 MVC Core

Código y licencia

Código en GitHub Ejemplos de prueba en GitHub Licencia de código abierto

Cuándo FoxIDs es relevante

Hay dos caminos prácticos. Use la biblioteca open-source cuando SAML 2.0 deba implementarse directamente en su aplicación .NET. Si la aplicación ya admite OpenID Connect o WS-Federation, FoxIDs puede gestionar la integración SAML 2.0 externamente mientras la aplicación sigue usando su protocolo existente.

  • Mantener las aplicaciones en OpenID Connect o WS-Federation mientras FoxIDs gestiona la conexión SAML 2.0
  • Operar la traducción de protocolos, certificados, metadatos y configuración de federación específica de partners fuera de la aplicación
  • Usar FoxIDs Cloud, self-hosted o despliegue híbrido según los requisitos operativos
  • FoxIDs usa ITfoxtec.Identity.Saml2 para el manejo del protocolo SAML 2.0, por lo que la biblioteca y la opción de puente están técnicamente alineadas
Documentación del puente SAML 2.0 Habla con un experto Empieza gratis

Entornos probados

El paquete ITfoxtec Identity Saml2 está probado para cumplir con Microsoft Entra ID (Azure AD), AD FS, Azure AD B2C, el NemLog-in3 danés (MitID), el Context Handler danés (en danés Fælleskommunal Adgangsstyring) y muchos otros IdP y RP.

ASP.NET MVC y ASP.NET Core MVC son compatibles con los paquetes ITfoxtec Identity SAML 2.0 MVC y MVC Core, que ayudan a integrar el paquete ITfoxtec SAML 2.0 en aplicaciones MVC y ASP.NET Core MVC.

Versiones .NET compatibles

.NET 10.0 .NET 9.0 .NET 8.0 .NET 7.0 .NET 6.0 .NET Standard 2.1 .NET Framework 4.6.2 .NET Framework 4.8

Bindings compatibles

  • Redirect Binding
  • Post Binding
  • Artifact Binding

Los bindings se pueden usar según sea necesario para:

  • Authn Request
  • Authn Response (SAML 2.0 Response)
  • Logout Request
  • Logout Response

Algoritmos de firma

Se admite SHA1/SHA256/SHA384/SHA512 para la firma de mensajes.

RSA SHA1 RSA SHA256 RSA SHA384 RSA SHA512 RSA-PSS SHA256 ECDSA SHA256 ECDSA SHA384 ECDSA SHA512
Mostrar URI de algoritmos
  • RSA SHA1http://www.w3.org/2000/09/xmldsig#rsa-sha1
  • RSA SHA256http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
  • RSA SHA384http://www.w3.org/2001/04/xmldsig-more#rsa-sha384
  • RSA SHA512http://www.w3.org/2001/04/xmldsig-more#rsa-sha512
  • RSA-PSS SHA256http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1
  • ECDSA SHA256http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256
  • ECDSA SHA384http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384
  • ECDSA SHA512http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512

Cifrado configurable

El cifrado de assertions se puede configurar por separado para cifrado de datos y cifrado de claves. Las opciones admitidas incluyen AES-CBC, AES-GCM, transporte de claves RSA y XML Encryption 1.1 RSA-OAEP con parámetros MGF validados.

Data
AES-CBC AES-GCM
Key
RSA 1.5 RSA-OAEP RSA-OAEP 1.1

Puedes usar la herramienta SAML 2.0 para decodificar tokens y crear certificados autofirmados con la herramienta de certificados.

Código

El código mostrado es solo una selección del código de ejemplo en GitHub.

El paquete ITfoxtec Identity Saml2 se integra en una aplicación ASP.NET Core MVC Relying Party (RP) mediante configuración en Startup y añadiendo un Auth Controller con los siguientes métodos. El binding mostrado puede cambiarse según los requisitos.

Además, es posible establecer algunos parámetros opcionales en Saml2AuthnRequest y Saml2LogoutRequest. En Saml2AuthnRequest, por ejemplo, se admite ForceAuthn, que obliga al usuario a ingresar credenciales incluso si ya existe un contexto SSO en el Security Token Service (STS) / Identity Provider (IdP).


Agregar configuración al método ConfigureServices en Startup

Configuración usando metadatos del IdP.
services.BindConfig<Saml2Configuration>(Configuration, "Saml2", (serviceProvider, saml2Configuration) =>
{
    saml2Configuration.SigningCertificate = CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
        Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:SigningCertificatePassword"]);
    saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer);

    var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
    var entityDescriptor = new EntityDescriptor();
    entityDescriptor.ReadIdPSsoDescriptorFromUrlAsync(httpClientFactory, new Uri(Configuration["Saml2:IdPMetadata"])).GetAwaiter().GetResult();
    if (entityDescriptor.IdPSsoDescriptor != null)
    {
        saml2Configuration.AllowedIssuer = entityDescriptor.EntityId;
        saml2Configuration.SingleSignOnDestination = entityDescriptor.IdPSsoDescriptor.SingleSignOnServices.First().Location;
        saml2Configuration.SingleLogoutDestination = entityDescriptor.IdPSsoDescriptor.SingleLogoutServices.First().Location;
        saml2Configuration.SignatureValidationCertificates.AddRange(entityDescriptor.IdPSsoDescriptor.SigningCertificates);
    }
    else
    {
        throw new Exception("IdPSsoDescriptor not loaded from metadata.");
    }
    return saml2Configuration;
});
services.AddSaml2();
services.AddHttpClient();

Configuración sin metadatos.
services.BindConfig<Saml2Configuration>(Configuration, "Saml2", (serviceProvider, saml2Configuration) =>
{
    saml2Configuration.SigningCertificate = CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
        Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:SigningCertificatePassword"]);
    saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer);

    saml2Configuration.SignatureValidationCertificates.Add(CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath(
        Configuration["Saml2:SignatureValidationCertificateFile"])));
    return saml2Configuration;
});
services.AddSaml2();   

Método de login en el Auth Controller

[Route("Login")]
public IActionResult Login(string returnUrl = null)
{
    var binding = new Saml2RedirectBinding();
    binding.SetRelayStateQuery(new Dictionary<string, string> 
        { { relayStateReturnUrl, returnUrl ?? Url.Content("~/") } });

    return binding.Bind(new Saml2AuthnRequest(config)).ToActionResult();
}

Método AssertionConsumerService en el Auth Controller

Tras un inicio de sesión correcto o fallido, el método ACS recibe la respuesta.
[Route("AssertionConsumerService")]
public async Task<IActionResult> AssertionConsumerService()
{       
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    var saml2AuthnResponse = new Saml2AuthnResponse(config);

    httpRequest.Binding.ReadSamlResponse(httpRequest, saml2AuthnResponse);
    if (saml2AuthnResponse.Status != Saml2StatusCodes.Success)
    {
        throw new AuthenticationException($"SAML Response status: {saml2AuthnResponse.Status}");
    }
    httpRequest.Binding.Unbind(httpRequest, saml2AuthnResponse);
    await saml2AuthnResponse.CreateSessionAsync(HttpContext,
        claimsTransform: (claimsPrincipal) => Task.FromResult(ClaimsTransform.Transform(claimsPrincipal)));

    var relayStateQuery = httpRequest.Binding.GetRelayStateQuery();
    var returnUrl = relayStateQuery.ContainsKey(relayStateReturnUrl) ? relayStateQuery[relayStateReturnUrl] : Url.Content("~/");
    return Redirect(returnUrl);
}

Método de logout en el Auth Controller

[HttpPost("Logout")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
    if (!User.Identity.IsAuthenticated)
    {
        return Redirect(Url.Content("~/"));
    }

    var binding = new Saml2PostBinding();
    var saml2LogoutRequest = await new Saml2LogoutRequest(config, User).DeleteSession(HttpContext);
    return binding.Bind(saml2LogoutRequest).ToActionResult();
}

Método LoggedOut en el Auth Controller

Tras un cierre de sesión correcto o fallido, el método LoggedOut recibe la respuesta.
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    httpRequest.Binding.Unbind(httpRequest, new Saml2LogoutResponse(config));

    return Redirect(Url.Content("~/"));
}

Método SingleLogout en el Auth Controller

Recibe una solicitud de Single Logout y envía una respuesta.
[Route("SingleLogout")]
public async Task<IActionResult> SingleLogout()
{
    Saml2StatusCodes status;
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    var logoutRequest = new Saml2LogoutRequest(config, User);
    try
    {
        httpRequest.Binding.Unbind(httpRequest, logoutRequest);
        status = Saml2StatusCodes.Success;
        await logoutRequest.DeleteSession(HttpContext);
    }
    catch (Exception exc)
    {
        // log exception
        Debug.WriteLine("SingleLogout error: " + exc.ToString());
        status = Saml2StatusCodes.RequestDenied;
    }

    var responseBinding = new Saml2PostBinding();
    responseBinding.RelayState = httpRequest.Binding.RelayState;
    var saml2LogoutResponse = new Saml2LogoutResponse(config)
    {
        InResponseToAsString = logoutRequest.IdAsString,
        Status = status,
    };
    return responseBinding.Bind(saml2LogoutResponse).ToActionResult();
}
Logo de FoxIDs

Desarrollado en Dinamarca. Alojado en Europa.

Desarrolladores

  • Documentación
  • Artículos
  • Lanzamientos
  • Estado de Cloud

Producto

  • Precios
  • Servicios
  • Despliegue
  • Cumplimiento
  • Centro de confianza

Empresa

  • Acerca de
  • Proveedor SKI
  • Contáctanos

Legal

  • Términos del servicio
  • Términos de alojamiento propio
  • RGPD y acuerdo de protección de datos
  • Política de privacidad y cookies
© 2026 FoxIDs, versión 2.15.19
GitHub LinkedIn

Preferencias de cookies

FoxIDs utiliza cookies necesarias para que el sitio web funcione. Selecciona Aceptar todas para permitir también cookies analíticas que nos ayudan a comprender y mejorar el uso del sitio web, o Rechazar todas para utilizar únicamente las cookies necesarias. Puedes cambiar tu elección en cualquier momento en nuestra Política de privacidad y cookies.

Leer la Política de privacidad y cookies