• +45 4949 9091
  • Supporto
  • Lingue
    • Lingue
    • English
    • Dansk
    • Svenska
    • Norsk
    • Deutsch
    • Nederlands
    • Polski
    • Français
    • Español
    • Italiano
    • Português
  • Registrati
  • Accedi
Logo FoxIDs
  • Docs e strumenti
    • Documentazione
    • Articoli
    • Strumento JWT
    • Strumento SAML 2.0
    • Strumento certificati
  • Casi d'uso
    • Panoramica
    • Clienti
    • Dipendenti
    • Partner
    • Storie dei clienti
  • Servizi
  • Piattaforma
    • Distribuzione
    • Multi-tenant
    • Logica di identità
    • Conformità
  • Prezzi
  • Registrati
  • Accedi

ITfoxtec Identity SAML 2.0

Il pacchetto open source ITfoxtec Identity Saml2 aggiunge il supporto SAML 2.0 / SAML-P per applicazioni .NET che devono agire come Identity Provider (IdP), Service Provider (SP) o Relying Party (RP).

Il pacchetto ITfoxtec Identity Saml2 è utile quando SAML 2.0 deve essere implementato direttamente nell’applicazione. Supporta accesso, disconnessione e single logout con SAML 2.0, metadati, Redirect Binding, POST Binding, Artifact Binding, firma e validazione dei messaggi, firme ECDSA sulle versioni moderne supportate di .NET e crittografia e decrittografia configurabili delle assertion.

Il nome dell'azienda ITfoxtec è cambiato in FoxIDs, ma i componenti manterranno per ora il nome ITfoxtec come parte del nome del componente.

Supporto

Fai domande su Stack Overflow e usa il tag 'itfoxtec-identity-saml2'.

Per assistenza all’implementazione o consulenza architetturale scrivi a contact@foxids.com.

Pacchetto

Rilasci NuGet ITfoxtec Identity SAML 2.0 NuGet ITfoxtec Identity SAML 2.0 MVC NuGet ITfoxtec Identity SAML 2.0 MVC Core

Codice e licenza

Codice su GitHub Esempi di test su GitHub Licenza open source

Quando FoxIDs è rilevante

Ci sono due percorsi pratici. Usa la libreria open source quando SAML 2.0 deve essere implementato direttamente nella tua applicazione .NET. Se l’applicazione supporta già OpenID Connect o WS-Federation, FoxIDs può gestire esternamente l’integrazione SAML 2.0 mentre l’applicazione continua a usare il protocollo esistente.

  • Mantenere le applicazioni su OpenID Connect o WS-Federation mentre FoxIDs gestisce la connessione SAML 2.0
  • Gestire traduzione dei protocolli, certificati, metadata e configurazione federation specifica per partner fuori dall’applicazione
  • Usare FoxIDs Cloud, self-hosted o deployment ibrido in base ai requisiti operativi
  • FoxIDs usa ITfoxtec.Identity.Saml2 per la gestione del protocollo SAML 2.0, quindi la libreria e l’opzione bridge sono tecnicamente allineate
Documentazione del bridge SAML 2.0 Parla con un esperto Inizia gratuitamente

Ambienti testati

Il pacchetto ITfoxtec Identity Saml2 è testato per la conformità con Microsoft Entra ID (Azure AD), AD FS, Azure AD B2C, il danese NemLog-in3 (MitID), il danese Context Handler (in danese chiamato Fælleskommunal Adgangsstyring) e molti altri IdP e RP.

ASP.NET MVC e ASP.NET Core MVC sono supportati dai pacchetti ITfoxtec Identity SAML 2.0 MVC e MVC Core, che aiutano a integrare il pacchetto ITfoxtec SAML 2.0 in applicazioni MVC e ASP.NET Core MVC.

Versioni .NET supportate

.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

Binding supportati

  • Binding Redirect
  • Binding Post
  • Binding Artifact

I binding possono essere usati secondo necessità per:

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

Algoritmi di firma

SHA1/SHA256/SHA384/SHA512 è supportato per la firma dei messaggi.

RSA SHA1 RSA SHA256 RSA SHA384 RSA SHA512 RSA-PSS SHA256 ECDSA SHA256 ECDSA SHA384 ECDSA SHA512
Mostra URI degli algoritmi
  • 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

Crittografia configurabile

La crittografia delle assertion può essere configurata separatamente per crittografia dei dati e crittografia della chiave. Le opzioni supportate includono AES-CBC, AES-GCM, trasporto chiave RSA e XML Encryption 1.1 RSA-OAEP con parametri MGF validati.

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

Puoi usare lo strumento SAML 2.0 per decodificare i token e creare certificati auto firmati con lo strumento certificati.

Codice

Il codice mostrato è solo una selezione del codice di esempio in GitHub.

Il pacchetto ITfoxtec Identity Saml2 viene integrato in un’applicazione ASP.NET Core MVC Relying Party (RP) tramite configurazione in Startup e aggiungendo un Auth Controller con i seguenti metodi. Il binding mostrato può essere modificato secondo necessità in base ai requisiti.

È inoltre possibile impostare alcuni parametri opzionali su Saml2AuthnRequest e Saml2LogoutRequest. Su Saml2AuthnRequest, ad esempio, è supportato ForceAuthn, che forzerà l'utente a inserire le credenziali anche se esiste già un contesto SSO sul Security Token Service (STS) / Identity Provider (IdP).


Aggiungi la configurazione al metodo ConfigureServices in Startup

Configurazione usando i metadati 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();

Configurazione senza metadati.
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();   

Metodo Login nel controller Auth

[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();
}

Metodo AssertionConsumerService nel controller Auth

Dopo un accesso riuscito o non riuscito, il metodo ACS riceve la risposta.
[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);
}

Metodo Logout nel controller Auth

[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();
}

Metodo LoggedOut nel controller Auth

Dopo una disconnessione riuscita o non riuscita, il metodo LoggedOut riceve la risposta.
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    httpRequest.Binding.Unbind(httpRequest, new Saml2LogoutResponse(config));

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

Metodo SingleLogout nel controller Auth

Riceve una richiesta di Single Logout e invia una risposta.
[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

Sviluppato in Danimarca. Ospitato in Europa.

Sviluppatori

  • Documentazione
  • Articoli
  • Rilasci
  • Stato di Cloud

Prodotto

  • Prezzi
  • Servizi
  • Distribuzione
  • Conformità
  • Centro di fiducia

Azienda

  • Informazioni
  • Fornitore SKI
  • Contattaci

Legale

  • Termini di servizio
  • Termini per auto-ospitato
  • Accordo sul trattamento dei dati e GDPR
  • Informativa privacy e cookie
© 2026 FoxIDs, versione 2.15.13
GitHub LinkedIn

Preferenze relative ai cookie

FoxIDs utilizza i cookie necessari per il funzionamento del sito. Seleziona Accetta tutti per consentire anche i cookie analitici che ci aiutano a comprendere e migliorare l’utilizzo del sito, oppure Rifiuta tutti per utilizzare solo i cookie necessari. Puoi modificare la tua scelta in qualsiasi momento nella nostra Informativa sulla privacy e sui cookie.

Leggi l’Informativa sulla privacy e sui cookie