Støtte

Still spørsmål på Stack Overflow og tagg med 'itfoxtec-identity-saml2'.

Kontakt contact@foxids.com for betalt konsulentbistand.

Pakke

Utgivelser
NuGet ITfoxtec Identity SAML 2.0
NuGet ITfoxtec Identity SAML 2.0 MVC
NuGet ITfoxtec Identity SAML 2.0 MVC Core

Kode og lisens

GitHub kode og eksempel
Åpen kildekode lisens

ITfoxtec Identity SAML 2.0

Den åpne kildekode ITfoxtec Identity Saml2 pakken legger til SAML-P støtte for både Identity Provider (IdP) og Relying Party (RP) oppå SAML 2.0 funksjonaliteten implementert i .NET.

Firmanavnet ITfoxtec er endret til FoxIDs men komponentene vil foreløpig beholde ITfoxtec navnet som en del av komponentnavnet.

Støttede .NET versjoner:
  • .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 viktigste delene av SAML-P standarden og noen valgfrie funksjoner. Melding signering og validering samt dekryptering er støttet. Pakken støtter SAML 2.0 login, logout, single logout og metadata. Både SP Initiated og IdP Initiated sign on er støttet.

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

Se test samples.

Kontakt Anders Revsgaard (anders@foxids.com) hvis du trenger en sample for en spesifikk IdP som den danske NemLog-in (MitID) eller Context Handler.
Det er en betalt tjeneste der du kan kjøpe en ferdig sample pakke for en IdP eller be om en tilpasset sample.

Du kan bruke SAML 2.0 verktøyet til å dekode tokens og lage selvsignerte sertifikater med sertifikatverktøyet.

Støttede bindinger:

  • Redirect Binding
  • Post Binding
  • Artifact Binding

Bindingene kan brukes etter behov for:

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

SHA1/SHA256/SHA384/SHA512 er støttet for melding signering.

  • 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 støttes av ITfoxtec Identity SAML 2.0 MVC og MVC Core pakkene som hjelper med å integrere ITfoxtec SAML 2.0 pakken i en MVC og MVC Core applikasjon.

Kode

Koden som vises er bare et utvalg av eksempel koden i GitHub.

ITfoxtec Identity Saml2 pakken integreres i en ASP.NET MVC Core Relying Party (RP) applikasjon ved konfigurasjon i Startup og ved å legge til en Auth Controller med de følgende fire metodene. Bindingen som vises kan endres etter behov avhengig av kravene.

Det er videre mulig å sette noen valgfrie parametere på Saml2AuthnRequest og Saml2LogoutRequest. På Saml2AuthnRequest støttes for eksempel ForceAuthn, som vil tvinge brukeren til å skrive inn innloggingsopplysninger selv om en SSO kontekst allerede eksisterer på Security Token Service (STS) / Identity Provider (IdP).


Legg til konfigurasjon i ConfigureServices metoden i Startup

Konfigurasjon 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();   

Konfigurasjon uten 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

Etter vellykket eller mislykket login mottar 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

Etter vellykket eller mislykket logout mottar 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

Mottar en Single Logout forespørsel 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();
}

Ditt personvern

Vi bruker cookies for å gjøre opplevelsen av nettstedene våre bedre. Klikk på 'Godta alle cookies' for å samtykke til bruk av cookies. For å reservere deg mot ikke-nødvendige cookies, klikk på 'Kun nødvendige cookies'.

Besøk vår personvernerklæring for mer