• +45 4949 9091
  • Wsparcie
  • Polski
    • Języki
    • English
    • Dansk
    • Svenska
    • Norsk
    • Deutsch
    • Nederlands
    • Polski
    • Français
    • Español
    • Italiano
    • Português
  • Zarejestruj się
  • Zaloguj się
Logo FoxIDs
  • Platforma
    • Wdrożenie
    • Multi-tenant
    • Logika tożsamości
    • Zgodność
  • Przypadki użycia
    • Przegląd
    • Klienci
    • Pracownicy
    • Partnerzy
    • Historie klientów
  • Usługi
  • Cennik
  • Docs i narzędzia
    • Dokumentacja
    • Artykuły
    • Narzędzie JWT
    • Narzędzie SAML 2.0
    • Narzędzie certyfikatów
  • Skontaktuj się z nami
  • Zarejestruj się
  • Zaloguj się

ITfoxtec Identity SAML 2.0

Open-sourceowy pakiet ITfoxtec Identity Saml2 dodaje obsługę SAML 2.0 / SAML-P dla aplikacji .NET, które muszą działać jako Identity Provider (IdP), Service Provider (SP) lub Relying Party (RP).

Pakiet ITfoxtec Identity Saml2 jest przydatny, gdy SAML 2.0 ma być zaimplementowany bezpośrednio w aplikacji. Obsługuje logowanie, wylogowanie i single logout przez SAML 2.0, metadane, Redirect Binding, POST Binding, Artifact Binding, podpisywanie i walidację komunikatów, podpisy ECDSA na obsługiwanych nowoczesnych wersjach docelowych .NET oraz konfigurowalne szyfrowanie i odszyfrowywanie assertion.

Nazwa firmy ITfoxtec została zmieniona na FoxIDs, ale komponenty na razie zachowają nazwę ITfoxtec jako część nazwy komponentu.

Wsparcie

Zadaj pytania na Stack Overflow i oznacz tagiem 'itfoxtec-identity-saml2'.

W sprawie pomocy przy implementacji lub doradztwa architektonicznego napisz na contact@foxids.com.

Pakiet

Wydania NuGet ITfoxtec Identity SAML 2.0 NuGet ITfoxtec Identity SAML 2.0 MVC NuGet ITfoxtec Identity SAML 2.0 MVC Core

Kod i licencja

Kod na GitHubie Przykłady testowe na GitHubie Licencja open-source

Kiedy FoxIDs jest właściwym wyborem

Istnieją dwie praktyczne ścieżki. Użyj biblioteki open-source, gdy SAML 2.0 powinien być zaimplementowany bezpośrednio w aplikacji .NET. Jeśli aplikacja już obsługuje OpenID Connect lub WS-Federation, FoxIDs może obsłużyć integrację SAML 2.0 zewnętrznie, podczas gdy aplikacja nadal korzysta z istniejącego protokołu.

  • Pozostaw aplikacje przy OpenID Connect lub WS-Federation, podczas gdy FoxIDs obsługuje połączenie SAML 2.0
  • Obsługuj tłumaczenie protokołów, certyfikaty, metadane i konfigurację federation specyficzną dla partnerów poza aplikacją
  • Użyj FoxIDs Cloud, self-hosted lub deploymentu hybrydowego zależnie od wymagań operacyjnych
  • FoxIDs używa ITfoxtec.Identity.Saml2 do obsługi protokołu SAML 2.0, więc biblioteka i opcja bridge są technicznie spójne
Dokumentacja mostu SAML 2.0 Porozmawiaj z ekspertem Zacznij za darmo

Przetestowane środowiska

Pakiet ITfoxtec Identity Saml2 jest testowany pod kątem zgodności z Microsoft Entra ID (Azure AD), AD FS, Azure AD B2C, duńskim NemLog-in3 (MitID), duńskim Context Handler (po duńsku Fælleskommunal Adgangsstyring) oraz wieloma innymi IdP i RP.

ASP.NET MVC i ASP.NET Core MVC są obsługiwane przez pakiety ITfoxtec Identity SAML 2.0 MVC i MVC Core, które pomagają zintegrować pakiet ITfoxtec SAML 2.0 z aplikacjami MVC i ASP.NET Core MVC.

Obsługiwane wersje .NET

.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

Obsługiwane powiązania

  • Redirect Binding
  • Post Binding
  • Artifact Binding

Powiązania mogą być używane w razie potrzeby do:

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

Algorytmy podpisu

SHA1/SHA256/SHA384/SHA512 jest obsługiwane do podpisywania komunikatów.

RSA SHA1 RSA SHA256 RSA SHA384 RSA SHA512 RSA-PSS SHA256 ECDSA SHA256 ECDSA SHA384 ECDSA SHA512
Pokaż identyfikatory URI algorytmów
  • 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

Konfigurowalne szyfrowanie

Szyfrowanie assertion można konfigurować osobno dla szyfrowania danych i szyfrowania klucza. Obsługiwane opcje obejmują AES-CBC, AES-GCM, RSA key transport oraz XML Encryption 1.1 RSA-OAEP z walidowanymi parametrami MGF.

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

Możesz użyć narzędzia SAML 2.0 do dekodowania tokenów i tworzenia certyfikatów samopodpisanych za pomocą narzędzia certyfikatów.

Kod

Pokazany kod to tylko wybrana część przykładowego kodu z GitHub.

Pakiet ITfoxtec Identity Saml2 jest integrowany z aplikacją ASP.NET Core MVC Relying Party (RP) przez konfigurację w Startup i dodanie kontrolera Auth z następującymi metodami. Pokazany binding można zmienić w zależności od wymagań.

Możliwe jest również ustawienie opcjonalnych parametrów w Saml2AuthnRequest i Saml2LogoutRequest. W Saml2AuthnRequest np. wspierany jest ForceAuthn, który wymusza ponowne wprowadzenie danych logowania, nawet jeśli istnieje kontekst SSO w Security Token Service (STS) / Identity Provider (IdP).


Dodaj konfigurację do metody ConfigureServices w Startup

Konfiguracja przy użyciu metadanych 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();

Konfiguracja bez metadanych.
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();   

Metoda Login w kontrolerze 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();
}

Metoda AssertionConsumerService w kontrolerze Auth

Po pomyślnym lub nieudanym logowaniu metoda ACS odbiera odpowiedź.
[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);
}

Metoda Logout w kontrolerze 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();
}

Metoda LoggedOut w kontrolerze Auth

Po pomyślnym lub nieudanym wylogowaniu metoda LoggedOut odbiera odpowiedź.
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    httpRequest.Binding.Unbind(httpRequest, new Saml2LogoutResponse(config));

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

Metoda SingleLogout w kontrolerze Auth

Odbiera żądanie funkcji Single Logout i wysyła odpowiedź.
[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

Tworzone w Danii. Hostowane w Europie.

Programiści

  • Dokumentacja
  • Artykuły
  • Wydania
  • Status Cloud

Produkt

  • Cennik
  • Usługi
  • Wdrożenie
  • Zgodność
  • Centrum zaufania

Firma

  • O nas
  • Dostawca SKI
  • Skontaktuj się z nami

Informacje prawne

  • Warunki świadczenia usług
  • Warunki hostingu własnego
  • RODO i umowa powierzenia danych
  • Polityka prywatności i cookies
© 2026 FoxIDs, wersja 2.15.26
GitHub LinkedIn