Support

Stil spørgsmål på Stack Overflow og tag med 'itfoxtec-identity-saml2'.

Kontakt contact@foxids.com for betalt konsulentbistand.

Pakke

Udgivelser
NuGet ITfoxtec Identity SAML 2.0
NuGet ITfoxtec Identity SAML 2.0 MVC
NuGet ITfoxtec Identity SAML 2.0 MVC Core

Kode og licens

GitHub kode og eksempel
Open source licens

ITfoxtec Identity SAML 2.0

Den open source ITfoxtec Identity Saml2 pakke tilføjer SAML-P understøttelse for både Identity Provider (IdP) og Relying Party (RP) oven på SAML 2.0 funktionaliteten implementeret i .NET.

Virksomhedsnavnet ITfoxtec er ændret til FoxIDs men komponenterne vil foreløbigt beholde ITfoxtec navnet som en del af komponentnavnet.

Understøttede .NET versioner:
  • .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 pakken implementerer de vigtigste dele af SAML-P standarden og nogle valgfrie funktioner. Meddelelsessignering og validering samt dekryptering er understøttet. Pakken understøtter SAML 2.0 login, logout, single logout og metadata. Både SP Initiated og IdP Initiated sign on er understøttet.

ITfoxtec Identity Saml2 pakken er testet for overensstemmelse med Microsoft Entra ID (Azure AD), AD FS, Azure AD B2C, den danske NemLog-in3 (MitID), den danske Context Handler (på dansk kaldet Fælleskommunal Adgangsstyring) og mange andre IdP'er og RP'er.

Se venligst test samples.

Kontakt Anders Revsgaard (anders@foxids.com) hvis du har brug for en sample til en specifik IdP såsom den danske NemLog-in (MitID) eller Context Handler.
Det er en betalt service, hvor du kan købe en færdig sample pakke til en IdP eller anmode om en tilpasset sample.

Du kan bruge SAML 2.0 værktøjet til at afkode tokens og oprette selvsignerede certifikater med certifikatværktøjet.

Understøttede bindings:

  • Redirect Binding
  • Post Binding
  • Artifact Binding

Bindings kan bruges efter behov til:

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

SHA1/SHA256/SHA384/SHA512 understøttes til meddelelsessignering.

  • 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 og ASP.NET MVC Core understøttes af ITfoxtec Identity SAML 2.0 MVC og MVC Core pakkerne, som hjælper med at integrere ITfoxtec SAML 2.0 pakken i en MVC og MVC Core applikation.

Kode

Koden, der vises, er kun et udvalg af eksempel koden på GitHub.

ITfoxtec Identity Saml2 pakken integreres i en ASP.NET MVC Core Relying Party (RP) applikation ved konfiguration i Startup og ved at tilføje en Auth Controller med de følgende fire metoder. Bindingen, der vises, kan ændres efter behov afhængigt af kravene.

Det er desuden muligt at sætte nogle valgfrie parametre på Saml2AuthnRequest og Saml2LogoutRequest. På Saml2AuthnRequest understøttes f.eks. ForceAuthn, som vil tvinge brugeren til at indtaste login oplysninger, selv om der allerede findes en SSO kontekst på Security Token Service (STS) / Identity Provider (IdP).


Tilføj konfiguration til 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 uden 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 metode 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 metode i Auth Controller

Efter vellykket eller mislykket login modtager ACS metoden 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 metode 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 metode i Auth Controller

Efter vellykket eller mislykket logout modtager LoggedOut metoden svaret.
[Route("LoggedOut")]
public IActionResult LoggedOut()
{
    var httpRequest = Request.ToGenericHttpRequest(validate: true);
    httpRequest.Binding.Unbind(httpRequest, new Saml2LogoutResponse(config));

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

SingleLogout metode i Auth Controller

Modtager en Single Logout anmodning og sender et 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();
}

Dit privatliv

Vi bruger cookies til at gøre din oplevelse på vores websites bedre. Klik på 'Acceptér alle cookies' for at acceptere brugen af cookies. For at fravælge ikke-nødvendige cookies, klik på 'Kun nødvendige cookies'.

Besøg vores privatlivspolitik for mere