fortigate_-_entra_id_saml_sso

Prerequisites

  • Required services: FortiGate with SSL VPN enabled, Microsoft Entra ID tenant
  • A valid public FQDN (sub.domain.tld) for the FortiGate SSL VPN certificate
  • A working certificate on the FortiGate (Let’s Encrypt, public CA, etc.)

Add FortiGate SSL VPN in Entra ID

  • Enterprise Applications → Add from Gallery → Select FortiGate SSL VPN

Configure Basic SAML Settings in Entra ID

  • Identifier (Entity ID)
  • Reply URL (ACS)
  • Sign-on URL
  • Logout URL
  • Attribute & Claim mappings (username, group)
  • Download the SAML Base64 Signing Certificate

SAML Claim Mapping (Azure → FortiGate)

FortiGate is strict about SAML attribute names. The attributes defined in Azure must match exactly the attributes that FortiGate expects under:

set user-name
set group-name

Required Claims in Entra ID

Under Single Sign-On → User Attributes & Claims:

Add this claim (FortiGate requires the literal name)

  • Claim name: username, source: user.userprincipalname

Edit the existing “groups” claim so that it sends Group Object IDs (not display names).

  • The expected claim name must be group

This ensures that the SAML token contains:

username = user@domain
group    = <Azure AD Group Object ID>

Why this matters

FortiGate matches SAML attributes using the `user-name` and `group-name` fields in the IdP configuration:

set user-name "username"
set group-name "group"

If the Azure claim sends the wrong attribute or the Object ID doesn't match exactly, FortiGate will not associate the session with the group, and the VPN connection will be denied.

https://learn.microsoft.com/en-us/entra/identity/saas-apps/fortigate-ssl-vpn-tutorial

Create Test User and Security Group in Entra ID

  • Create test user
  • Assign user to the FortiGate SSL VPN enterprise app
  • Create Security Group (e.g., *FortiGateAccess*)
  • Copy the Object ID (used later in FortiGate group matching)

Upload Certificate to FortiGate

  • Import the SAML IdP certificate into FortiGate
  • Rename the certificate if needed for clarity

Configure FortiGate SAML Settings (CLI)

  • Define the SAML IdP (`config user saml`)
  • Configure entity-id, SSO URLs, IdP URLs, certificate, and attribute mapping
config user saml
  edit azure
    set cert "<FortiGate VPN Server Certificate Name>"
    set entity-id "https://vpn.my.org:10443/remote/saml/metadata"
    set single-sign-on-url "https://vpn.my.org:10443/remote/saml/login"
    set single-logout-url "https://vpn.my.org:10443/remote/saml/logout"

    set idp-entity-id <Azure AD Identifier>
    set idp-single-sign-on-url <Azure Login URL>
    set idp-single-logout-url <Azure Logout URL>
    set idp-cert <Azure SAML Base64 Certificate Name>

    set user-name username
    set group-name group
  next
end

Configure FortiGate User Group

  • Create a user group mapped to Azure SAML IdP
  • Match against the Azure AD Security Group Object ID
config user group
  edit AAD-FortiVPN
    set member azure
    config match
      edit 1
        set server-name azure
        set group-name 343744cd---GROUP-ID---67bb7e68
      next
    end
  next
end

Configure SSL VPN Portals and Firewall Policy

  • Create SSL VPN portal(s)
  • Assign the portal to the SAML group
  • Add firewall policies allowing access from the SAML user group

Optional: Multiple SSL VPN Realms

  • Enable the SSL-VPN Realms feature
  • Create multiple realms (e.g., *FullTunnel*, *SplitTunnel*)
  • Assign specific portals and firewall policies per realm

FortiClient Setup (Optional)

  • Configure FortiClient for SSL VPN using SAML SSO
  • Ensure FQDN and port match the FortiGate SAML configuration

Testing and Validation

  • Use Azure → “Test” SSO functionality
  • Direct login to FortiGate VPN portal Web UI
  • Launch from MyApps portal tile
  • Use FortiGate debugging commands:
diagnose debug application sslvpn -1
diagnose debug application samld -1
diagnose debug console timestamp enable
diagnose debug enable

To stop debugging:

diagnose debug reset
diagnose debug disable

FortiClient connection stages:

  • 20% – TCP connection
  • 40% – SAML authentication
  • 80% – Tunnel negotiation
  • 100% – Connected

For example, if it fails at 40%, SAML assertion is not validated.

Troubleshooting Notes

  • Re-download metadata/cert when FQDN or port changes
  • Signature validation requirements changed in FortiOS 7.2.12 / 7.4.9 / 7.6.4
  • Common errors (e.g., *“Signature element not found”* from FortiGate)
  • Adjust group claim: ensure the Azure AD group appears in the SAML assertion

References

fortigate_-_entra_id_saml_sso.txt · Last modified: 2025/12/13 00:22 by oso