RDWeb SSO avec Okta

Vous avec une infrastructure Remote Desktop Services et vous souhaitez mettre en place du SSO.

Un client a récemment mis en place Okta, un fournisseur d’identité (Identity Provider, IdP) au sein de son Système d’Information.
Il nous a demandé de connecter la partie Web des services de bureau à distance (RDWeb) à son nouvel Identity Provider.

Malgré nos recherches, nous n’avons trouvé aucune documentation complète et fonctionnelle. Nous partageons donc notre propre guide détaillé, résultat de nombreuses heures de recherche et de tests.

Pour configurer le SSO, il faut modifier le fichier web.config situé dans C:\Windows\Web\RDWeb\Pages.

<?xml version="1.0" encoding="UTF-8"?>
<!--
    Note: As an alternative to hand editing this file you can use the
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in
    machine.config.comments usually located in
    \Windows\Microsoft.Net\Framework\v2.x\Config
-->
<configuration>

<!-- Idaptive -->
<configSections>
  <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection,Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35" />
</configSections>
<!-- /Idaptive -->


  <!-- Admin Defined settings -->
  <appSettings>
    <!-- PasswordChangeEnabled: Provides password change page for users. Value must be "true" or "false" -->
    <add key="PasswordChangeEnabled" value="false" />
      
    <!-- LocalHelp: Displays local help for users, instead of the web-based help. Value must be "true" or "false" -->
    <add key="LocalHelp" value="false" />

    <!-- ShowDesktops: Displays or hides the Remote Desktops tab. Value must be "true" or "false" -->
    <add key="ShowDesktops" value="true" />

    <!-- DefaultTSGateway: Admin can preset this to a given Gateway name, or set to "" for no gateway. -->
    <add key="DefaultTSGateway" value="" />

    <!-- GatewayCredentialsSource: TS Gateway Authentication Type.
         Admins can preset this.
         0 = User Password
         1 = Smartcard
         4 = "Ask me later"
    -->
    <add key="GatewayCredentialsSource" value="4" />

    <!-- Devices and resources: Preset the Checkbox values to either true or false -->
    <add key="xPrinterRedirection" value="true" />
    <add key="xClipboard" value="true" />
    <add key="xDriveRedirection" value="false" />
    <add key="xPnPRedirection" value="false" />
    <add key="xPortRedirection" value="false" />

    <!--  Public/Private Mode Timeout for FBA -->
    <add key="PublicModeSessionTimeoutInMinutes" value="20" />
    <add key="PrivateModeSessionTimeoutInMinutes" value="240" />

    <!--  Checkbox to opt for optimized LAN experience -->
    <add key="ShowOptimizeExperience" value="false" />
    <add key="OptimizeExperienceState" value="false" />

    <add key="AuthenticationContext" value="pages" />
  </appSettings>

  <connectionStrings />

  <system.web>

    <!-- Idaptive -->
    <httpRuntime targetFramework="4.5" requestValidationMode= "2.0"/>
    <pages validateRequest= "false"/>
    <!-- /Idaptive -->

    <!--
        The <authentication> section enables configuration
        of the security authentication mode used by
        ASP.NET to identify an incoming user.
    -->
      <!--
          To turn on Windows Authentication:
              - uncomment <authentication mode="Windows"/> section
              - and comment out:
              1) <authentication mode="Forms"> section.
              2) <modules> and <security> sections in <system.webServer> section at the end of the file.
              3) Optional: Windows Authentication will work in https.  However, to turn off https, disable 'Require SSL' for both RDWeb and RDWeb/Pages VDIR.
                 Launch IIS Manager UI, click on RDWeb VDIR, double click on SSL Settings in the middle pane, uncheck 'Require SSL' and
                 click Apply in the top right in the right pane.  Repeat the steps for RDWeb/Pages VDIR.
      -->

    <!-- Idaptive -->
    <authorization><deny users="?" /></authorization>
    <authentication mode="Windows">
      <forms defaultUrl="default.aspx" loginUrl="default.aspx" name="TSWAAuthHttpOnlyCookie" protection="All" requireSSL="true" />
    </authentication>
    <!-- /Idaptive -->

      <webParts>
          <personalization defaultProvider="TSPortalProvider">
            <providers>
              <add name="TSPortalProvider" type="Microsoft.TerminalServices.Publishing.Portal.TSPortalProvider" />
          </providers>
          <authorization><deny users="?" /></authorization>
        </personalization>
      </webParts>

    <!-- machineKey attribute allows you to have a RDWeb cluster for high availability. You will have to generate valid decryptionKey and validationKey -->
        <machineKey decryption="Auto" decryptionKey="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" validationKey="BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" />

  </system.web>

  <system.webServer>
    <handlers>
        <add name="PagesWebFeedHandler" path="WebFeed.aspx" verb="*" type="Microsoft.TerminalServices.Publishing.Portal.PagesWebFeedHandler" preCondition="integratedMode" />
    </handlers>

    <modules runAllManagedModulesForAllRequests="true">
      <remove name="FormsAuthentication" />
      <add name="RDWAFormsAuthenticationModule" type="Microsoft.TerminalServices.Publishing.Portal.FormAuthentication.TSDomainFormsAuthentication" />
      <add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
      <add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
    </modules>

    <security>
        <authentication>
            <windowsAuthentication enabled="true" useKernelMode="false">
                    <extendedProtection tokenChecking="None" />
                    <providers>
                        <clear />
                        <add value="NTLM" />
                        <add value="Negotiate" />
                        <add value="Negotiate:Kerberos" />
                    </providers>
                </windowsAuthentication>
            <anonymousAuthentication enabled="false" />
        </authentication>
    </security>
    <httpRedirect enabled="false" />

  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="TSPortalWebPart" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="6.0.0.0" newVersion="6.1.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  

  <microsoft.identityModel>
    <service>
      <certificateValidation certificateValidationMode="None" />
      <!-- Replace urn:okta:app:cccccccccccccccccccc with correct app urn from Okta -->
      <audienceUris>
        <add value="urn:microsoft:rdweb" />
        <add value="urn:okta:app:cccccccccccccccccccc" />
      </audienceUris>

      <securityTokenHandlers>
        <add type="Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
          <samlSecurityTokenRequirement mapToWindows="true" useWindowsTokenService="true" />
        </add>
      </securityTokenHandlers>

      <applicationService>
        <claimTypeRequired>
          <claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" optional="true" />
        </claimTypeRequired>
      </applicationService>
      <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
        <trustedIssuers>
          <!-- Replace thumbprint="..." with certificate thumbprint and urn:okta:app:... with correct app urn from Okta -->
          <add thumbprint="dddddddddddddddddddddddddddddddddddddddd" name="urn:okta:app:cccccccccccccccccccc" />
        </trustedIssuers>
      </issuerNameRegistry>
      <federatedAuthentication>
        <!-- Replace issuer="https://..." with correct Okta URL thumbprint and urn:okta:app:... with correct app urn from Okta -->
        <wsFederation passiveRedirectEnabled="true" issuer="https://id.client.com/app/template_wsfed/sso/wsfed/passive" realm="urn:okta:app:cccccccccccccccccccc" requireHttps="true" />
        <cookieHandler requireSsl="false" />
      </federatedAuthentication>
    </service>
  </microsoft.identityModel>


  <location path="rdp">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
    <system.webServer>
      <handlers>
        <add name="RDWAResourceFileHandler" path="rdp" verb="*" type="Microsoft.TerminalServices.Publishing.Portal.ResourceFileHandler" preCondition="integratedMode" allowPathInfo="true" />
      </handlers>
    </system.webServer>
   </location>

</configuration>

Zoom sur Okta (pour ceux qui ne connaissent pas encore !)
Okta est une plateforme cloud de gestion des identités et des accès (IAM) qui permet aux entreprises de gérer en toute sécurité l’accès aux applications et aux données. Avec Okta, vous pouvez fournir un accès sécurisé à vos employés, partenaires et clients, tout en réduisant les risques de sécurité liés aux identités.

Avantages d’Okta : Sécurité Renforcée
Okta offre une sécurité de pointe grâce à des fonctionnalités telles que l’authentification multifactorielle (MFA), la détection des anomalies et la gestion des accès basée sur les rôles. Ces fonctionnalités garantissent que seuls les utilisateurs autorisés peuvent accéder aux ressources critiques.

Expérience Utilisateur Améliorée
Avec Okta, les utilisateurs bénéficient d’une expérience de connexion simplifiée. La fonctionnalité Single Sign-On (SSO) permet aux utilisateurs de se connecter une seule fois pour accéder à toutes leurs applications. Cela réduit la nécessité de mémoriser plusieurs mots de passe et améliore l’efficacité.

Intégration Facile
Okta s’intègre facilement avec des milliers d’applications populaires telles que Microsoft Office 365, Google Workspace, Salesforce et bien d’autres. Cette compatibilité étendue permet aux entreprises de centraliser la gestion des accès sans perturber leurs flux de travail existants.

Évolutivité et Flexibilité
Que votre entreprise soit une startup ou une grande entreprise, Okta s’adapte à vos besoins. La plateforme est conçue pour évoluer avec votre entreprise, offrant la flexibilité nécessaire pour gérer des milliers d’utilisateurs et de rôles différents.

Conformité Réglementaire
Okta aide les entreprises à se conformer aux réglementations de sécurité et de confidentialité telles que le RGPD, le CCPA et d’autres normes de l’industrie. La plateforme fournit des outils pour gérer les accès et surveiller les activités, garantissant ainsi la conformité.

Cas d’Utilisation d’Okta
1) Accès des Employés
Okta facilite la gestion des accès des employés à diverses applications, qu’ils soient au bureau ou en télétravail. Cela garantit une productivité optimale tout en maintenant une sécurité rigoureuse.

2) Accès des Partenaires
Okta permet aux entreprises de gérer les accès de leurs partenaires commerciaux de manière sécurisée, facilitant ainsi la collaboration et la communication.

3) Accès des Clients
Avec Okta, les entreprises peuvent offrir une expérience de connexion fluide et sécurisée à leurs clients, améliorant ainsi leur satisfaction et leur fidélité.