Connexion silencieuse avec ssoSilent()

Si vous disposez déjà d’une session qui existe avec le serveur d’authentification, vous pouvez utiliser l’API ssoSilent() pour effectuer une demande de jetons sans interaction.

Avec une indication utilisateur

Si vous disposez déjà des informations de connexion de l’utilisateur, vous pouvez le transmettre à l’API pour améliorer les performances et vous assurer que le serveur d’autorisation recherche la session de compte appropriée. Vous pouvez transmettre l’un des éléments suivants dans l’objet de requête afin d’obtenir un jeton silencieusement avec succès.

  • account (qui peut être récupéré à l’aide des API de compte)
  • sid (qui peut être récupéré à partir du idTokenClaims d’un objet account)
  • login_hint (qui peut être récupéré à partir de la propriété username de l’objet de compte ou de la revendication upn dans le jeton d’ID)

La transmission d’un compte recherche d’abord la revendication sid dans les revendications du jeton, puis utilise en second recours loginHint (s’il est fourni) ou le nom d’utilisateur du compte.

const silentRequest: SsoSilentRequest = {
    scopes: ["User.Read", "Mail.Read"],
    loginHint: "user@contoso.com"
};

this.authService.ssoSilent(silentRequest)
    .subscribe({
        next: (result) => console.log("Success!"), // Handle result
        error: (error) => console.log(error) // Handle error
    });

Sans indication utilisateur

S’il n’y a pas suffisamment d’informations disponibles sur l’utilisateur, vous pouvez tenter d’utiliser l’API ssoSilentsans passer un account, sid ou login_hint.

const silentRequest = {
    scopes: ["User.Read", "Mail.Read"]
};

Toutefois, sachez que si votre application a des chemins de code pour plusieurs utilisateurs dans une session de navigateur unique ou si l’utilisateur a plusieurs comptes pour cette session de navigateur unique, il existe une probabilité plus élevée d’erreurs de connexion silencieuses. L’erreur suivante peut s’afficher en cas de plusieurs sessions de compte trouvées par le serveur d’autorisation :

InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.

Cela indique que le serveur n’a pas pu déterminer quel compte se connecter, et nécessite l’un des paramètres ci-dessus (account, login_hint, sid) ou une connexion interactive pour choisir le compte.

Gestion des échecs

Si ssoSilent() échoue, nous vous recommandons de gérer cette erreur en vous connectant de manière interactive. Voici un exemple de ssoSilent() utilisé dans les applications app.component.ts:

import { Component, OnInit } from '@angular/core';
import { MsalService } from '@azure/msal-angular';
import { SilentRequest, SsoSilentRequest } from '@azure/msal-browser';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  constructor(
    private authService: MsalService,
  ) {}

  ngOnInit(): void {
    const silentRequest: SsoSilentRequest = {
      scopes: ["User.Read"],
      loginHint: "user@contoso.com"
    }

    this.authService.ssoSilent(silentRequest)
      .subscribe({
        next: (result: AuthenticationResult) => {
          console.log("SsoSilent succeeded!"); // Handle result
        }, 
        error: (error) => {
          this.authService.loginRedirect(); // Handle error by logging in interactively
        }
      });
  }
}