Supporto
Fai domande su Stack Overflow e usa il tag 'itfoxtec-identity-saml2'.
Contatta contact@foxids.com per consulenza a pagamento.
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 GitHub ed esempio
Licenza open source
ITfoxtec Identity SAML 2.0
Il pacchetto open source ITfoxtec Identity Saml2 aggiunge il supporto SAML-P sia per Identity Provider (IdP) sia per Relying Party (RP) oltre alle funzionalità SAML 2.0 implementate in .NET.
Il nome dell'azienda ITfoxtec è cambiato in FoxIDs ma i componenti manterranno per ora il nome ITfoxtec come parte del nome del componente.
- .NET 10.0
- .NET 9.0
- .NET 8.0
- .NET 7.0
- .NET 6.0
- .NET Standard 2.1
- .NET Framework 4.6.2 and 4.8
Il pacchetto ITfoxtec Identity Saml2 implementa le parti più importanti dello standard SAML-P e alcune funzionalità opzionali. Sono supportate la firma e la validazione dei messaggi così come la decrittazione. Il pacchetto supporta login SAML 2.0, logout, single logout e metadata. Sono supportati sia SP Initiated sia IdP Initiated sign on.
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.
Consulta gli esempi di test.
Contatta Anders Revsgaard (anders@foxids.com) se hai bisogno di un esempio per un IdP specifico come il danese NemLog-in (MitID) o Context Handler.
È un servizio a pagamento in cui puoi acquistare un pacchetto di esempio pronto all'uso per un IdP o richiedere un esempio personalizzato.
>
Puoi usare lo strumento SAML 2.0 per decodificare i token e creare certificati auto firmati con lo strumento certificati.
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
SHA1/SHA256/SHA384/SHA512 è supportato per la firma dei messaggi.
- SHA1: http://www.w3.org/2000/09/xmldsig#rsa-sha1
- SHA256: http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
- SHA384: http://www.w3.org/2001/04/xmldsig-more#rsa-sha384
- SHA512: http://www.w3.org/2001/04/xmldsig-more#rsa-sha512
ASP.NET MVC e ASP.NET MVC Core sono supportati dai pacchetti ITfoxtec Identity SAML 2.0 MVC e MVC Core che aiutano a integrare il pacchetto ITfoxtec SAML 2.0 in un'applicazione MVC o MVC Core.
Codice
Il codice mostrato è solo una selezione del codice di esempio in GitHub.
Il pacchetto ITfoxtec Identity Saml2 è integrato in un'applicazione ASP.NET MVC Core Relying Party (RP) tramite configurazione in Startup e aggiungendo un Auth Controller con i seguenti quattro 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.Configure<Saml2Configuration>(Configuration.GetSection("Saml2")); services.Configure<Saml2Configuration>(saml2Configuration => { saml2Configuration.SigningCertificate = CertificateUtil.Load(AppEnvironment.MapToPhysicalFilePath( Configuration["Saml2:SigningCertificateFile"]), Configuration["Saml2:SigningCertificatePassword"]); saml2Configuration.AllowedAudienceUris.Add(saml2Configuration.Issuer); var entityDescriptor = new EntityDescriptor(); entityDescriptor.ReadIdPSsoDescriptorFromUrl(new Uri(Configuration["Saml2:IdPMetadata"])); if (entityDescriptor.IdPSsoDescriptor != null) { 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."); } }); services.AddSaml2();
Configurazione senza metadati.
services.Configure<Saml2Configuration>(Configuration.GetSection("Saml2")); services.Configure<Saml2Configuration>(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"]))); }); 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 login riuscito o fallito 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.Unbind(httpRequest, saml2AuthnResponse); await saml2AuthnResponse.CreateSession(HttpContext, ClaimsTransform: (claimsPrincipal) => ClaimsTransform.Transform(claimsPrincipal)); var returnUrl = httpRequest.Binding.GetRelayStateQuery()[relayStateReturnUrl]; return Redirect(string.IsNullOrWhiteSpace(returnUrl) ? Url.Content("~/") : 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 un logout riuscito o fallito 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 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(); }