• +45 4949 9091
  • Support
  • Langues
    • Langues
    • English
    • Dansk
    • Svenska
    • Norsk
    • Deutsch
    • Nederlands
    • Polski
    • Français
    • Español
    • Italiano
    • Português
  • S'inscrire
  • Se connecter
Logo FoxIDs
  • Docs et outils
    • Documentation
    • Articles
    • Outil JWT
    • Outil SAML 2.0
    • Outil de certificat
  • Cas d'usage
    • Vue d'ensemble
    • Clients
    • Employés
    • Partenaires
    • Témoignages clients
  • Services
  • Plateforme
    • Déploiement
    • Multi-tenant
    • Logique d'identité
    • Conformité
  • Tarifs
  • S'inscrire
  • Se connecter

ITfoxtec Identity SAML 2.0

Le package open-source ITfoxtec Identity Saml2 ajoute la prise en charge SAML 2.0 / SAML-P pour les applications .NET qui doivent agir comme Identity Provider (IdP), Service Provider (SP) ou Relying Party (RP).

Le package ITfoxtec Identity Saml2 est utile lorsque SAML 2.0 doit être intégré directement dans l’application. Il prend en charge la connexion, la déconnexion et le single logout avec SAML 2.0, les métadonnées, Redirect Binding, POST Binding, Artifact Binding, la signature et la validation des messages, les signatures ECDSA sur les versions modernes prises en charge de .NET, ainsi que le chiffrement et le déchiffrement configurables des assertions.

Le nom de la société ITfoxtec a changé pour FoxIDs, mais les composants conservent pour l’instant le nom ITfoxtec dans le nom du composant.

Support

Posez vos questions sur Stack Overflow et taguez avec « itfoxtec-identity-saml2 ».

Pour une aide à l’implémentation ou des conseils d’architecture, écrivez à contact@foxids.com.

Package

Versions NuGet ITfoxtec Identity SAML 2.0 NuGet ITfoxtec Identity SAML 2.0 MVC NuGet ITfoxtec Identity SAML 2.0 MVC Core

Code et licence

Code sur GitHub Exemples de test sur GitHub Licence open-source

Quand FoxIDs est pertinent

Il existe deux chemins pratiques. Utilisez la bibliothèque open-source lorsque SAML 2.0 doit être implémenté directement dans votre application .NET. Si l’application prend déjà en charge OpenID Connect ou WS-Federation, FoxIDs peut gérer l’intégration SAML 2.0 en externe pendant que l’application continue d’utiliser son protocole existant.

  • Conserver les applications sur OpenID Connect ou WS-Federation pendant que FoxIDs gère la connexion SAML 2.0
  • Exploiter la traduction de protocoles, les certificats, les métadonnées et la configuration federation spécifique aux partenaires en dehors de l’application
  • Utiliser FoxIDs Cloud, self-hosted ou un déploiement hybride selon les exigences opérationnelles
  • FoxIDs utilise ITfoxtec.Identity.Saml2 pour la gestion du protocole SAML 2.0, ce qui aligne techniquement la bibliothèque et l’option bridge
Documentation du pont SAML 2.0 Parler à un expert Commencez gratuitement

Environnements testés

Le package ITfoxtec Identity Saml2 est testé pour la conformité avec Microsoft Entra ID (Azure AD), AD FS, Azure AD B2C, le NemLog-in3 danois (MitID), le Context Handler danois (appelé en danois Fælleskommunal Adgangsstyring) et de nombreux autres IdP et RP.

ASP.NET MVC et ASP.NET Core MVC sont pris en charge par les packages ITfoxtec Identity SAML 2.0 MVC et MVC Core, qui aident à intégrer le package ITfoxtec SAML 2.0 dans les applications MVC et ASP.NET Core MVC.

Versions .NET prises en charge

.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 pris en charge

  • Redirect Binding
  • Post Binding
  • Artifact Binding

Les bindings peuvent être utilisés au besoin pour :

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

Algorithmes de signature

SHA1/SHA256/SHA384/SHA512 sont pris en charge pour la signature des messages.

RSA SHA1 RSA SHA256 RSA SHA384 RSA SHA512 RSA-PSS SHA256 ECDSA SHA256 ECDSA SHA384 ECDSA SHA512
Afficher les URI des algorithmes
  • 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

Chiffrement configurable

Le chiffrement des assertions peut être configuré séparément pour le chiffrement des données et le chiffrement des clés. Les options prises en charge incluent AES-CBC, AES-GCM, le transport de clé RSA et XML Encryption 1.1 RSA-OAEP avec paramètres MGF validés.

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

Vous pouvez utiliser l’outil SAML 2.0 pour décoder les jetons et créer des certificats auto-signés avec l’outil de certificats.

Code

Le code présenté n’est qu’une sélection du code d’exemple sur GitHub.

Le package ITfoxtec Identity Saml2 est intégré dans une application ASP.NET Core MVC Relying Party (RP) via la configuration dans Startup et l’ajout d’un Auth Controller avec les méthodes suivantes. Le binding présenté peut être modifié selon les besoins.

Il est également possible de définir des paramètres optionnels sur Saml2AuthnRequest et Saml2LogoutRequest. Sur Saml2AuthnRequest, par exemple, ForceAuthn est pris en charge, ce qui force l’utilisateur à saisir ses identifiants même si un contexte SSO existe déjà sur le Security Token Service (STS) / Identity Provider (IdP).


Ajouter la configuration à la méthode ConfigureServices dans Startup

Configuration à l’aide des métadonnées 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();

Configuration sans métadonnées.
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éthode de connexion dans le 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éthode AssertionConsumerService dans le Auth Controller

Après une connexion réussie ou ayant échoué, la méthode ACS reçoit la réponse.
[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éthode de déconnexion dans le 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éthode LoggedOut dans le Auth Controller

Après une déconnexion réussie ou ayant échoué, la méthode LoggedOut reçoit la réponse.
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    httpRequest.Binding.Unbind(httpRequest, new Saml2LogoutResponse(config));

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

Méthode SingleLogout dans le Auth Controller

Reçoit une demande de Single Logout et envoie une réponse.
[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 FoxIDs

Développé au Danemark. Hébergé en Europe.

Développeurs

  • Documentation
  • Articles
  • Versions
  • Statut Cloud

Produit

  • Tarifs
  • Services
  • Déploiement
  • Conformité
  • Centre de confiance

Entreprise

  • À propos
  • Fournisseur SKI
  • Nous contacter

Juridique

  • Conditions d'utilisation
  • Conditions d'auto-hébergement
  • RGPD et accord de protection des données
  • Politique de confidentialité et de cookies
© 2026 FoxIDs, version 2.15.13
GitHub LinkedIn

Choix des cookies

FoxIDs utilise des cookies nécessaires au fonctionnement du site. Sélectionnez Tout accepter pour autoriser également les cookies d’analyse qui nous aident à comprendre et à améliorer l’utilisation du site, ou Tout refuser pour utiliser uniquement les cookies nécessaires. Vous pouvez modifier votre choix à tout moment dans notre Politique de confidentialité et relative aux cookies.

Lire la Politique de confidentialité et relative aux cookies