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.

Stödda .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 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();
}

Din integritet

Vi använder cookies för att göra din upplevelse av våra webbplatser bättre. Klicka på 'Acceptera alla cookies' för att godkänna användningen av cookies. För att avstå från icke-nödvändiga cookies, klicka på 'Endast nödvändiga cookies'.

Besök vår integritetspolicy för mer