Support
Ställ frågor på Stack Overflow och tagga med 'itfoxtec-identity-saml2'.
Kontakta contact@foxids.com för betald konsultation.
Paket
Utgåvor
NuGet ITfoxtec Identity SAML 2.0
NuGet ITfoxtec Identity SAML 2.0 MVC
NuGet ITfoxtec Identity SAML 2.0 MVC Core
Kod och licens
GitHub kod och exempel
Öppen källkodslicens
ITfoxtec Identity SAML 2.0
Det open source ITfoxtec Identity Saml2 paketet lägger till SAML-P stöd för både Identity Provider (IdP) och Relying Party (RP) ovanpå SAML 2.0 funktionaliteten som är implementerad i .NET.
Företagsnamnet ITfoxtec har ändrats till FoxIDs men komponenterna kommer tills vidare att behålla ITfoxtec namnet som en del av komponentnamnet.
- .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
ITfoxtec Identity Saml2 paketet implementerar de viktigaste delarna av SAML-P standarden och vissa valfria funktioner. Meddelandesignering och validering samt dekryptering stöds. Paketet stödjer SAML 2.0 login, logout, single logout och metadata. Både SP Initiated och IdP Initiated sign on stöds.
ITfoxtec Identity Saml2 paketet är testat för efterlevnad med Microsoft Entra ID (Azure AD), AD FS, Azure AD B2C, danska NemLog-in3 (MitID), den danska Context Handler (på danska kallad Fælleskommunal Adgangsstyring) och många andra IdP:er och RP:er.
Se testexempel.
Kontakta Anders Revsgaard (anders@foxids.com) om du behöver ett exempel för en specifik IdP såsom den danska NemLog-in (MitID) eller Context Handler.
Det är en betald tjänst där du kan köpa ett färdigt exempelpaket för en IdP eller begära ett anpassat exempel.
>
Du kan använda SAML 2.0 verktyget för att avkoda tokens och skapa självsignerade certifikat med certifikatverktyget.
Stödda bindings:
- Redirect Binding
- Post Binding
- Artifact Binding
Bindings kan användas efter behov för:
- Authn Request
- Authn Response (SAML 2.0 Response)
- Logout Request
- Logout Response
SHA1/SHA256/SHA384/SHA512 stöds för meddelandesignering.
- 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 och ASP.NET MVC Core stöds av ITfoxtec Identity SAML 2.0 MVC och MVC Core paketen som hjälper till att integrera ITfoxtec SAML 2.0 paketet i en MVC och MVC Core applikation.
Kod
Koden som visas är bara ett urval av exempelkod i GitHub.
ITfoxtec Identity Saml2 paketet integreras i en ASP.NET MVC Core Relying Party (RP) applikation genom konfiguration i Startup och genom att lägga till en Auth Controller med följande fyra metoder. Bindningen som visas kan ändras vid behov beroende på kraven.
Det är dessutom möjligt att sätta vissa valfria parametrar på Saml2AuthnRequest och Saml2LogoutRequest. På Saml2AuthnRequest stöds till exempel ForceAuthn, vilket tvingar användaren att ange inloggningsuppgifter även om en SSO kontext redan finns på Security Token Service (STS) / Identity Provider (IdP).
Lägg till konfiguration i ConfigureServices metoden i Startup
Konfiguration med IdP metadata.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();
Konfiguration utan metadata.
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();
Login metod i 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(); }
AssertionConsumerService metod i Auth Controller
Efter lyckad eller misslyckad inloggning tar ACS metoden emot svaret.[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); }
Logout metod i 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(); }
LoggedOut metod i Auth Controller
Efter lyckad eller misslyckad logout tar LoggedOut metoden emot svaret.[Route("LoggedOut")] public IActionResult LoggedOut() { var httpRequest = Request.ToGenericHttpRequest(validate: true); httpRequest.Binding.Unbind(httpRequest, new Saml2LogoutResponse(config)); return Redirect(Url.Content("~/")); }
SingleLogout metod i Auth Controller
Tar emot en Single Logout begäran och skickar ett svar.[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(); }