• +45 4949 9091
  • Wsparcie
  • Języki
    • 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.19
GitHub LinkedIn

Wybór plików cookie

FoxIDs używa niezbędnych plików cookie, aby witryna mogła działać. Wybierz Zaakceptuj wszystkie, aby zezwolić również na analityczne pliki cookie, które pomagają nam zrozumieć sposób korzystania z witryny i ją ulepszać, lub Odrzuć wszystkie, aby używać tylko niezbędnych plików cookie. Swój wybór możesz w każdej chwili zmienić w naszej Polityce prywatności i plików cookie.

Przeczytaj Politykę prywatności i plików cookie