Partager via


Créer un complément Office ASP.NET qui utilise l’authentification unique

Les utilisateurs peuvent se connecter à Office et votre complément Web Office peut tirer parti de cette procédure de connexion pour autoriser les utilisateurs à accéder à votre complément et à Microsoft Graph sans obliger les utilisateurs à se connecter une deuxième fois. Cet article vous guide tout au long du processus d’activation de l’authentification unique (SSO) dans un complément.

L’exemple vous montre comment générer les composants suivants :

  • Code côté client qui fournit un volet Office qui se charge dans Microsoft Excel, Word ou PowerPoint. Le code côté client appelle l’API getAccessToken() JS Office pour obtenir le jeton d’accès SSO pour appeler les API REST côté serveur.
  • Code côté serveur qui utilise ASP.NET Core pour fournir une SEULE API /api/filesREST . Le code côté serveur utilise la bibliothèque d’authentification Microsoft pour .NET (MSAL.NET) pour la gestion des jetons, l’authentification et l’autorisation.

L’exemple utilise l’authentification unique et le flux On-Behalf-Of (OBO) pour obtenir des jetons d’accès corrects et appeler des API Microsoft Graph. Si vous n’êtes pas familiarisé avec le fonctionnement de ce flux, consultez Fonctionnement de l’authentification unique au moment de l’exécution pour plus d’informations.

Conditions préalables

  • Visual Studio 2019 ou version ultérieure.

  • Charge de travail de développement Office/SharePoint lors de la configuration de Visual Studio.

  • Au moins quelques fichiers et dossiers stockés sur OneDrive Entreprise dans votre abonnement Microsoft 365.

  • Build de Microsoft 365 qui prend en charge l’ensemble de conditions requises IdentityAPI 1.3. Vous pouvez bénéficier d’un abonnement microsoft 365 E5 pour les développeurs, qui inclut un bac à sable pour les développeurs, via le Programme pour les développeurs Microsoft 365 ; Pour plus d’informations, consultez la FAQ. Le bac à sable développeur inclut un abonnement Microsoft Azure que vous pouvez utiliser pour les inscriptions d’applications dans les étapes ultérieures de cet article. Si vous préférez, vous pouvez utiliser un abonnement Microsoft Azure distinct pour les inscriptions d’applications. Obtenez un abonnement d’essai sur Microsoft Azure.

Configurer le projet de démarrage

Clonez ou téléchargez le référentiel sur Complément Office ASPNET SSO.

Notes

Il existe deux versions de l’exemple.

  • Le dossier Begin est un projet de démarrage. L’interface utilisateur et d’autres aspects du complément qui ne sont pas directement liés à l’authentification unique ou à l’autorisation sont déjà terminés. Les sections suivantes de cet article vous guident tout au long de la procédure d’exécution de cette dernière.
  • Le dossier Complete contient le même exemple avec toutes les étapes de codage de cet article terminées. Pour utiliser la version terminée, suivez simplement les instructions de cet article, mais remplacez « Begin » par « Complete » et ignorez les sections Code côté client et Code côté serveur.

Utilisez les valeurs suivantes pour les espaces réservés pour les étapes d’inscription d’application suivantes.

Espace réservé Valeur
<add-in-name> Office-Add-in-ASPNET-SSO
<fully-qualified-domain-name> localhost:44355
Autorisations de Microsoft Graph profile, openid, Files.Read

Inscrire le complément auprès de la plateforme d’identités Microsoft

Vous devez créer une inscription d’application dans Azure qui représente votre serveur web. Cela permet la prise en charge de l’authentification afin que les jetons d’accès appropriés puissent être émis au code client dans JavaScript. Cette inscription prend en charge l’authentification unique dans le client et l’authentification de secours à l’aide de la bibliothèque d’authentification Microsoft (MSAL).

  1. Connectez-vous au portail Azure avec les informations d’identification d’administrateur de votre location Microsoft 365. Par exemple : MyName@contoso.onmicrosoft.com.

  2. Sélectionner les inscriptions d’applications. Si vous ne voyez pas l’icône, recherchez « Inscription de l’application » dans la barre de recherche.

    Page d’accueil du portail Azure.

    La page Inscriptions d'applications s’affiche.

  3. Sélectionnez Nouvelle inscription.

    Nouvelle inscription dans le volet Inscriptions d’applications.

    La page Inscrire une application s’affiche.

  4. Sur la page Inscrire une application, définissez les valeurs comme suit.

    • Définissez le Nom sur <add-in-name>.
    • Définissez Types de comptes pris en chargesur Comptes dans n’importe quel annuaire organisationnel (n’importe quel annuaire Azure AD - multilocataire) et comptes Microsoft personnels (par exemple, Skype, Xbox).
    • Définissez URI de redirection pour utiliser l’application monopage (SPA) de plateforme et l’URI sur https://<fully-qualified-domain-name>/dialog.html.

    Inscrire un volet d’application avec le nom et le compte pris en charge terminés.

  5. Sélectionner Inscription. Un message s’affiche indiquant que l’inscription de l’application a été créée.

    Message indiquant que l’inscription de l’application a été créée.

  6. Copiez et enregistrez les valeurs de l’ID d’application (client) et de l’ID d’annuaire (locataire). Vous utiliserez les deux plus tard.

    Volet Inscription d’application pour Contoso affichant l’ID client et l’ID d’annuaire.

Ajouter une clé secrète client

Parfois appelé mot de passe d’application, une clé secrète client est une valeur de chaîne que votre application peut utiliser à la place d’un certificat pour s’identifier elle-même.

  1. Dans le volet gauche, sélectionnez Certificats & secrets. Ensuite, sous l’onglet Secrets client , sélectionnez Nouvelle clé secrète client.

    Volet Certificats & secrets.

    Le volet Ajouter une clé secrète client s’affiche.

  2. Ajoutez une description pour votre clé secrète client.

  3. Sélectionnez une expiration pour le secret ou spécifiez une durée de vie personnalisée.

    • La durée de vie de la clé secrète client est limitée à deux ans (24 mois) ou moins. Vous ne pouvez pas spécifier une durée de vie personnalisée supérieure à 24 mois.
    • Microsoft vous recommande de définir une valeur d’expiration inférieure à 12 mois.

    Ajoutez un volet de clé secrète client avec la description et expire.

  4. Sélectionnez Ajouter. Le nouveau secret est créé et la valeur est affichée temporairement.

Importante

Enregistrez la valeur du secret à utiliser dans le code de votre application cliente. Cette valeur de secret n’est plus jamais affichée une fois que vous avez quitté ce volet.

Exposer une API web

  1. Dans le volet gauche, sélectionnez Exposer une API.

    Le volet Exposer une API s’affiche .

    Volet Exposer une API d’une inscription d’application.

  2. Sélectionnez Définir pour générer un URI d’ID d’application.

    Bouton Définir dans le volet Exposer une API de l’inscription de l’application.

    La section permettant de définir l’URI de l’ID d’application s’affiche avec un URI d’ID d’application généré au format api://<app-id>.

  3. Mettez à jour l’URI de l’ID d’application sur api://<fully-qualified-domain-name>/<app-id>.

    Modifiez le volet URI d’ID d’application avec le port localhost défini sur 44355.

    • L’URI de l’ID d’application est prérempli avec l’ID d’application (GUID) au format api://<app-id>.
    • Le format d’URI de l’ID d’application doit être : api://<fully-qualified-domain-name>/<app-id>
    • Insérez entre fully-qualified-domain-nameapi:// et <app-id> (qui est un GUID). Par exemple : api://contoso.com/<app-id>.
    • Si vous utilisez localhost, le format doit être api://localhost:<port>/<app-id>. Par exemple : api://localhost:3000/c6c1f32b-5e55-4997-881a-753cc1d563b7.

    Pour plus d’informations sur l’URI de l’ID d’application, consultez Attribut identificateur de manifeste d’applicationUris.

    Notes

    Si un message d’erreur s’affiche indiquant que le domaine appartient déjà à quelqu’un et que c’est vous qui en êtes le propriétaire, suivez la procédure décrite dans Quickstart  : Ajouter votre nom de domaine personnalisé à l’aide du Portail Azure Active Directory pour l’inscrire, puis répétez cette étape. (Cette erreur peut également se produire si vous n’êtes pas connecté avec les informations d’identification d’un administrateur dans la location Microsoft 365. Consultez l’étape 2. Déconnectez-vous et reconnectez-vous avec les informations d’identification d’administrateur et répétez le processus de l’étape 3.)

Ajouter une étendue

  1. Dans la page Exposer une API , sélectionnez Ajouter une étendue.

    Sélectionnez le bouton Ajouter une étendue.

    Le volet Ajouter une étendue s’ouvre.

  2. Dans le volet Ajouter une étendue , spécifiez les attributs de l’étendue. Le tableau suivant montre des exemples de valeurs pour et complément Outlook nécessitant les profileautorisations , openid, Files.ReadWriteet Mail.Read . Modifiez le texte pour qu’il corresponde aux autorisations dont votre complément a besoin.

    Champ Description Values
    Nom de l'étendue Nom de votre étendue. Une convention de nommage d’étendue courante est resource.operation.constraint. Pour l’authentification unique, cette valeur doit être définie sur access_as_user.
    Qui peut donner son consentement Détermine si le consentement de l’administrateur est requis ou si les utilisateurs peuvent donner leur consentement sans approbation de l’administrateur. Pour découvrir l’authentification unique et les exemples, nous vous recommandons de définir cette option sur Administrateurs et utilisateurs.

    Sélectionnez Administrateurs uniquement pour obtenir des autorisations à privilèges plus élevés.
    Nom d’affichage du consentement de l’administrateur Brève description de l’objectif de l’étendue visible uniquement par les administrateurs. Read/write permissions to user files. Read permissions to user mail and profiles.
    Description du consentement administrateur Description plus détaillée de l’autorisation accordée par l’étendue que seuls les administrateurs voient. Allow Office to have read/write permissions to all user files and read permissions to all user mail. Office can call the app's web APIs as the current user.
    Nom d’affichage du consentement de l’utilisateur Brève description de l’objectif de l’étendue. Affiché aux utilisateurs uniquement si vous définissez Qui peut donner son consentement aux administrateurs et aux utilisateurs. Read/write permissions to your files. Read permissions to your mail and profile.
    Description du consentement de l’utilisateur Description plus détaillée de l’autorisation accordée par l’étendue. Affiché aux utilisateurs uniquement si vous définissez Qui peut donner son consentement aux administrateurs et aux utilisateurs. Allow Office to have read/write permissions to your files, and read permissions to your mail and profile.
  3. Définissez l’étatsur Activé, puis sélectionnez Ajouter une étendue.

    Définissez l’état sur activé et sélectionnez le bouton Ajouter une étendue.

    La nouvelle étendue que vous avez définie s’affiche dans le volet.

    Nouvelle étendue affichée dans le volet Exposer une API.

    Notes

    La partie domaine du nom de l’étendue affiché juste sous le champ de texte devrait automatiquement correspondre à l’URI d’ID d’application définie à l’étape précédente avec /access_as_user ajouté au bout (par exemple, api://localhost:6789/c6c1f32b-5e55-4997-881a-753cc1d563b7/access_as_user).

  4. Sélectionnez Ajouter une application cliente.

    Sélectionnez Ajouter une application cliente.

    Le volet Ajouter une application cliente s’affiche .

  5. Dans l’ID client , entrez ea5a67f6-b6f3-4338-b240-c655ddc3cc8e. Cette valeur pré-autorise tous les points de terminaison d’application Microsoft Office. Si vous souhaitez également pré-autoriser Office lorsqu’il est utilisé à l’intérieur de Microsoft Teams, ajoutez 1fec8e78-bce4-4aaf-ab1b-5451cc387264 (Microsoft Teams desktop et Teams mobile) et 5e3ce6c0-2b1f-4285-8d4b-75ee78787346 (Teams sur le web).

    Notes

    L’ID ea5a67f6-b6f3-4338-b240-c655ddc3cc8e pré-autorise Office sur toutes les plateformes suivantes. Vous pouvez également entrer un sous-ensemble approprié des ID suivants si, pour une raison quelconque, vous souhaitez refuser l’autorisation à Office sur certaines plateformes. Si vous le faites, laissez de côté les ID des plateformes à partir desquelles vous souhaitez refuser l’autorisation. Les utilisateurs de votre complément sur ces plateformes ne pourront pas appeler vos API web, mais d’autres fonctionnalités de votre complément fonctionneront toujours.

    • d3590ed6-52b3-4102-aeff-aad2292ab01c (Microsoft Office)
    • 93d53678-613d-4013-afc1-62e9e444a0a5 (Office sur le web)
    • bc59ab01-8403-45c6-8796-ac3ef710b3e3 (Outlook sur le web)
  6. Dans Étendues autorisées, cochez la api://<fully-qualified-domain-name>/<app-id>/access_as_user case.

  7. Sélectionnez Ajouter une application.

    Volet Ajouter une application cliente.

Ajouter des autorisations Microsoft Graph

  1. Dans le volet gauche, sélectionnez Autorisations d’API.

    Volet Autorisations de l’API.

    Le volet Autorisations de l’API s’ouvre.

  2. Sélectionnez Ajouter une autorisation.

    Ajout d’une autorisation dans le volet Autorisations de l’API.

    Le volet Demander des autorisations d’API s’ouvre.

  3. Sélectionnez Microsoft Graph.

    Bouton Demander des autorisations d’API avec Microsoft Graph.

  4. Sélectionnez Autorisations déléguées.

    Bouton Demander des autorisations d’API avec autorisations déléguées.

  5. Dans la zone de recherche Sélectionner des autorisations , recherchez les autorisations dont votre complément a besoin. Par exemple, pour un complément Outlook, vous pouvez utiliser profile, openid, Files.ReadWriteet Mail.Read.

    Notes

    L’autorisation User.Read est peut-être déjà répertoriée par défaut. Comme il est recommandé de demander uniquement les autorisations nécessaires, nous vous recommandons de décocher la case pour cette autorisation si votre complément n’en a pas réellement besoin.

  6. Cochez la case pour chaque autorisation telle qu’elle apparaît. Notez que les autorisations ne restent pas visibles dans la liste lorsque vous sélectionnez chacune d’elles. Après avoir sélectionné les autorisations dont votre complément a besoin, sélectionnez Ajouter des autorisations.

    Volet Demander des autorisations d’API avec certaines autorisations sélectionnées.

  7. Sélectionnez Accorder le consentement de l’administrateur pour [nom du locataire] . Sélectionnez Oui pour la confirmation qui s’affiche.

Configurer la version du jeton d’accès

Vous devez définir la version du jeton d’accès acceptable pour votre application. Cette configuration est effectuée dans le manifeste de l’application Azure Active Directory.

Définir la version du jeton d’accès

La version du jeton d’accès peut changer si vous avez choisi un type de compte autre que Comptes dans un annuaire organisationnel (n’importe quel annuaire Azure AD - Multilocataire) et des comptes Microsoft personnels (par exemple, Skype, Xbox). Procédez comme suit pour vous assurer que la version du jeton d’accès est correcte pour l’utilisation de l’authentification unique Office.

  1. Dans le volet gauche, sélectionnez Manifeste.

    Sélectionnez Manifeste Azure.

    Le manifeste de l’application Azure Active Directory s’affiche.

  2. Entrez 2 comme valeur pour la propriété accessTokenAcceptedVersion.

    Valeur de la version du jeton d’accès acceptée.

  3. Sélectionnez Enregistrer.

    Un message s’affiche sur le navigateur indiquant que le manifeste a été mis à jour avec succès.

    Message de manifeste mis à jour.

Félicitations ! Vous avez terminé l’inscription de l’application pour activer l’authentification unique pour votre complément Office.

Configurer la solution

  1. À la racine du dossier Begin , ouvrez le fichier solution (.sln) dans Visual Studio. Cliquez avec le bouton droit (ou sélectionnez et maintenez la touche) sur le nœud supérieur dans l’Explorateur de solutions (le nœud Solution, et non l’un des nœuds du projet), puis sélectionnez Définir les projets de démarrage.

  2. Sous Propriétés communes, sélectionnez Projet de démarrage, puis Plusieurs projets de démarrage. Vérifiez que l’Action pour les deux projets est définie sur Démarrer et que le projet Office-Add-in-ASPNETCoreWebAPI est répertorié en premier. Fermez la boîte de dialogue.

  3. Dans l’Explorateur de solutions, choisissez le projet Office-Add-in-ASPNET-SSO-manifest et ouvrez le fichier manifeste de complément « Office-Add-in-ASPNET-SSO.xml », puis faites défiler jusqu’au bas du fichier. Juste au-dessus de la balise de fin </VersionOverrides> , vous trouverez le balisage suivant.

    <WebApplicationInfo>
         <Id>Enter_client_ID_here</Id>
     	<Resource>api://localhost:44355/Enter_client_ID_here</Resource>
     	<Scopes>
            <Scope>Files.Read</Scope>
     		<Scope>profile</Scope>
            <Scope>openid</Scope>
     	</Scopes>
     </WebApplicationInfo>
    
  4. Remplacez l’espace réservé « Enter_client_ID_here » aux deux emplacements du balisage par l’ID d’application que vous avez copié lors de la création de l’inscription de l’application Office-Add-in-ASPNET-SSO . Il s’agit du même ID que celui que vous avez utilisé pour l’ID d’application dans le fichier appsettings.json.

    Notes

    La <valeur ressource> est l’URI d’ID d’application que vous définissez lors de l’inscription du complément. La <section Étendues> est utilisée uniquement pour générer une boîte de dialogue de consentement si le complément est vendu via AppSource.

  5. Enregistrez et fermez le fichier manifeste.

  6. Dans l’Explorateur de solutions, choisissez le projet Office-Add-in-ASPNET-SSO-web et ouvrez le fichier appsettings.json .

  7. Remplacez l’espace réservé Enter_client_id_here par la valeur d’ID d’application (client) que vous avez enregistrée précédemment.

  8. Remplacez l’espace réservé Enter_client_secret_here par la valeur de clé secrète client que vous avez enregistrée précédemment.

    Notes

    Vous devez également modifier tenantId pour prendre en charge un seul locataire si vous avez configuré l’inscription de votre application pour un seul locataire. Remplacez la valeur Commune par l’ID d’application (client) pour la prise en charge monolocataire.

  9. Enregistrez et fermez le fichier appsettings.json.

Code côté client

Obtenir le jeton d’accès et appeler l’API REST du serveur d’applications

  1. Dans le projet Office-Add-in-ASPNETCore-WebAPI , ouvrez le fichier wwwroot\js\HomeES6.js . Il dispose déjà d’un code qui garantit que les promesses sont prises en charge, même dans le contrôle d’affichage web Trident (Internet Explorer 11), et un Office.onReady appel pour affecter un gestionnaire au seul bouton du complément.

    Notes

    Comme son nom l’indique, le HomeES6.js utilise la syntaxe JavaScript ES6, car l’utilisation async de et await montre au mieux la simplicité essentielle de l’API d’authentification unique. Lorsque le serveur localhost est démarré, ce fichier est transpilé en syntaxe ES5 afin que l’exemple prend en charge Trident.

  2. Dans la fonction getUserFileNames, remplacez TODO 1 par le code suivant. Tenez compte du code suivant :

    • Il appelle Office.auth.getAccessToken pour obtenir le jeton d’accès à partir d’Office à l’aide de l’authentification unique. Ce jeton contiendra l’identité de l’utilisateur ainsi que l’autorisation d’accès au serveur d’applications.
    • Le jeton d’accès est passé à callRESTApi qui effectue l’appel réel au serveur d’applications. Le serveur d’applications utilise ensuite le flux OBO pour appeler Microsoft Graph.
    • Toutes les erreurs d’appel getAccessToken sont gérées par handleClientSideErrors.
       let fileNameList = null;
    try {
        let accessToken = await Office.auth.getAccessToken(options);
        fileNameList = await callRESTApi("/api/files", accessToken);
    }
    catch (exception) {
        if (exception.code) {
            handleClientSideErrors(exception);
        }
        else {
            showMessage("EXCEPTION: " + exception);
        }
    }
    
    
  3. Dans la fonction getUserFileNames, remplacez TODO 2 par le code suivant. Cela permet d’écrire la liste des noms de fichiers dans le document.

     try {
         await writeFileNamesToOfficeDocument(fileNameList);
         showMessage("Your data has been added to the document.");
     } catch (error) {
         // The error from writeFileNamesToOfficeDocument will begin 
         // "Unable to add filenames to document."
         showMessage(error);
     }
    
  4. Dans la fonction callRESTApi, remplacez TODO 3 par le code suivant. Tenez compte du code suivant :

    • Il construit un en-tête d’autorisation contenant le jeton d’accès. Cela confirme au serveur d’applications que ce code client dispose d’autorisations d’accès aux API REST.
    • Il demande des types de retour JSON, afin que toutes les valeurs de retour soient gérées dans JSON.
    • Toutes les erreurs sont transmises à handleServerSideErrors pour traitement.
     try {
         let result = await $.ajax({
             url: relativeUrl,
             headers: { "Authorization": "Bearer " + accessToken },
             type: "GET",
             dataType: "json",
             contentType: "application/json; charset=utf-8"
         });
         return result;
     } catch (error) {
         handleServerSideErrors(error);
     }
    

Gérer les erreurs d’authentification unique et les erreurs d’API REST d’application

  1. Dans la fonction handleSSOErrors, remplacez TODO 4 par le code suivant. Pour plus d’informations sur ces erreurs, reportez-vous à Résoudre les problèmes liés à SSO dans les compléments Office.

     switch (error.code) {
         case 13001:
             // No one is signed into Office. If the add-in cannot be effectively used when no one 
             // is logged into Office, then the first call of getAccessToken should pass the 
             // `allowSignInPrompt: true` option.
             showMessage("No one is signed into Office. But you can use many of the add-ins functions anyway. If you want to log in, press the Get OneDrive File Names button again.");
             break;
         case 13002:
             // The user aborted the consent prompt. If the add-in cannot be effectively used when consent
             // has not been granted, then the first call of getAccessToken should pass the `allowConsentPrompt: true` option.
             showMessage("You can use many of the add-ins functions even though you have not granted consent. If you want to grant consent, press the Get OneDrive File Names button again.");
             break;
         case 13006:
             // Only seen in Office on the web.
             showMessage("Office on the web is experiencing a problem. Please sign out of Office, close the browser, and then start again.");
             break;
         case 13008:
             // Only seen in Office on the web.
             showMessage("Office is still working on the last operation. When it completes, try this operation again.");
             break;
         case 13010:
             // Only seen in Office on the web.
             showMessage("Follow the instructions to change your browser's zone configuration.");
             break;
         default:
             // For all other errors, including 13000, 13003, 13005, 13007, 13012, and 50001, fall back
             // to non-SSO sign-in by using MSAL authentication.
             showMessage("SSO failed. In these cases you should implement a falback to MSAL authentication.");
             break;
     }
    
  2. Dans la fonction handleServerSideErrors, remplacez TODO 5 par le code suivant.

    // Check headers to see if admin has not consented.
    const header = errorResponse.getResponseHeader('WWW-Authenticate');
    if (header !== null && header.includes('proposedAction=\"consent\"')) {
        showMessage("MSAL ERROR: " + "Admin consent required. Be sure admin consent is granted on all scopes in the Azure app registration.");
        return;
    }
    
    
  3. Dans la fonction handleServerSideErrors, remplacez TODO 6 par le code suivant. Tenez compte du code suivant :

    • Dans certains cas, un consentement supplémentaire est requis, par exemple 2FA. L’identité Microsoft retourne les revendications supplémentaires requises pour obtenir le consentement complet. Ce code ajoute la authChallenge propriété avec les revendications supplémentaires et appelle getUserfileNames à nouveau. Lorsque getAccessToken est appelé à nouveau avec les revendications supplémentaires, l’utilisateur reçoit une invite pour toutes les formes d’authentification requises.
    // Check if Microsoft Graph requires an additional form of authentication. Have the Office host 
    // get a new token using the Claims string, which tells Microsoft identity to prompt the user for all 
    // required forms of authentication.
    const errorDetails = JSON.parse(errorResponse.responseJSON.value.details);
    if (errorDetails) {
        if (errorDetails.error.message.includes("AADSTS50076")) {
            const claims = errorDetails.message.Claims;
            const claimsAsString = JSON.stringify(claims);
            getUserFileNames({ authChallenge: claimsAsString });
            return;
        }
    }
    
  4. Dans la fonction handleServerSideErrors, remplacez TODO 7 par le code suivant. Tenez compte du code suivant :

    • Dans les rares cas où le jeton d’authentification unique d’origine a expiré, il détecte cette condition d’erreur et appelle getUserFilenames à nouveau. Il en résulte un autre appel à getAccessToken qui retourne un jeton d’accès actualisé. La retryGetAccessToken variable compte les nouvelles tentatives et est actuellement configurée pour ne réessayer qu’une seule fois.
    • Enfin, si une erreur ne peut pas être gérée, la valeur par défaut consiste à afficher l’erreur dans le volet Office.
    // Results from other errors (other than AADSTS50076) will have an ExceptionMessage property.
    const exceptionMessage = JSON.parse(errorResponse.responseText).ExceptionMessage;
    if (exceptionMessage) {
        // On rare occasions the access token is unexpired when Office validates it,
        // but expires by the time it is sent to Microsoft identity in the OBO flow. Microsoft identity will respond
        // with "The provided value for the 'assertion' is not valid. The assertion has expired."
        // Retry the call of getAccessToken (no more than once). This time Office will return a 
        // new unexpired access token.
        if ((exceptionMessage.includes("AADSTS500133"))
            && (retryGetAccessToken <= 0)) {
            retryGetAccessToken++;
            getUserFileNames();
            return;
        }
        else {
            showMessage("MSAL error from application server: " + JSON.stringify(exceptionMessage));
            return;
        }
    }
    // Default error handling if previous checks didn't apply.
    showMessage(errorResponse.responseJSON.value);
    
  5. Enregistrez le fichier.

Code côté serveur

Le code côté serveur est un serveur ASP.NET Core qui fournit des API REST que le client peut appeler. Par exemple, l’API /api/files REST obtient une liste de noms de fichiers à partir du dossier OneDrive de l’utilisateur. Chaque appel d’API REST nécessite un jeton d’accès par le client pour s’assurer que le client approprié accède à ses données. Le jeton d’accès est échangé contre un jeton Microsoft Graph via le flux On-Behalf-Of (OBO). Le nouveau jeton Microsoft Graph est mis en cache par la bibliothèque MSAL.NET pour les appels d’API suivants. Il n’est jamais envoyé en dehors du code côté serveur. La documentation relative aux identités Microsoft fait référence à ce serveur en tant que serveur de niveau intermédiaire, car il se trouve au milieu du flux du code côté client vers les services Microsoft. Pour plus d’informations, consultez Demande de jeton d’accès de niveau intermédiaire

Configurer Microsoft Graph et le flux OBO

  1. Ouvrez le Program.cs fichier et remplacez par TODO 8 le code suivant. Tenez compte du code suivant :

    • Il ajoute les services requis pour gérer la validation des jetons requise pour les API REST.
    • Il ajoute la prise en charge des flux Microsoft Graph et OBO dans l’appel à EnableTokenAcquisitionToCallDownstreamApi().AddMicrosoftGraph(...). Le flux OBO est géré automatiquement pour vous, et le Kit de développement logiciel (SDK) Microsoft Graph est fourni à vos contrôleurs d’API REST.
    • La configuration DownstreamApi est spécifiée dans le fichier appsettings.json .
    // Add services to the container.
    builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
                    .EnableTokenAcquisitionToCallDownstreamApi()
                        .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi"))
                        .AddInMemoryTokenCaches();
    
    

Créer l’API REST /api/filenames

  1. Dans le dossier Contrôleurs , ouvrez le fichier FilesController.cs . remplacez par TODO 9 le code suivant. Tenez compte du code suivant :

    • Il spécifie l’attribut [Authorize] permettant de s’assurer que le jeton d’accès est validé pour chaque appel à des API REST dans la FilesController classe . Pour plus d’informations, consultez Validation des jetons.
    • Il spécifie l’attribut [RequiredScope("access_as_user")] pour s’assurer que le client a l’étendue access_as_user correcte dans le jeton d’accès.
    • Le constructeur initialise l’objet pour faciliter l’appel _graphServiceClient des API REST Microsoft Graph.
    [Authorize]
    [Route("api/[controller]")]
    [RequiredScope("access_as_user")]
    public class FilesController : Controller
    {        
        public FilesController(ITokenAcquisition tokenAcquisition, GraphServiceClient graphServiceClient, IOptions<MicrosoftGraphOptions> graphOptions)
        {
            _tokenAcquisition = tokenAcquisition;
            _graphServiceClient = graphServiceClient;
            _graphOptions = graphOptions;
    
        }
    
        private readonly ITokenAcquisition _tokenAcquisition;
        private readonly GraphServiceClient _graphServiceClient;
        private readonly IOptions<MicrosoftGraphOptions> _graphOptions;
    
        // TODO 10: Add the REST API to get filenames.
    
    }
    
  2. Remplacez TODO 10 par le code suivant. Tenez compte du code suivant :

    • Il crée l’API /api/files REST.
    • Il gère les exceptions de MSAL via MsalException la classe .
    • Il gère les exceptions des appels d’API Microsoft Graph via la ServiceException classe .
     // GET api/files
        [HttpGet]
        [Produces("application/json")]
        public async Task<IActionResult> Get()
        {
            List<DriveItem> result = new List<DriveItem>();
            try
            {
                var files = await _graphServiceClient.Me.Drive.Root.Children.Request()
                    .Top(10)
                    .Select(m => new { m.Name })
                    .GetAsync();
    
                result = files.ToList();
            }
            catch (MsalException ex)
            {
                var errorResponse = new
                {
                    message = "An authentication error occurred while acquiring a token for downstream API",
                    details = ex.Message
                };
    
                return StatusCode((int)HttpStatusCode.Unauthorized, Json(errorResponse));
            }
            catch (ServiceException ex)
            {
                if (ex.InnerException is MicrosoftIdentityWebChallengeUserException challengeException)
                {
                    _tokenAcquisition.ReplyForbiddenWithWwwAuthenticateHeader(_graphOptions.Value.Scopes.Split(' '),
                        challengeException.MsalUiRequiredException);
                }
                else
                {
                    var errorResponse = new
                    {
                        message = "An error occurred calling Microsoft Graph",
                        details = ex.RawResponseBody
                    };
                    return StatusCode((int)HttpStatusCode.BadRequest, Json(errorResponse));
                }
            }
            catch (Exception ex)
            {
                var errorResponse = new
                {
                    message = "An error occurred while calling the downstream API",
                    details = ex.Message
                };
                return StatusCode((int)HttpStatusCode.BadRequest, Json(errorResponse));
    
            }
            return Json(result);
        }
    

Exécutez la solution

  1. Dans Visual Studio, dans le menu Générer , sélectionnez Nettoyer la solution. Une fois l’opération terminée, ouvrez de nouveau le menu Build, puis sélectionnez Générer la solution.

  2. Dans l’Explorateur de solutions, sélectionnez le nœud de projet Office-Add-in-ASPNET-SSO-manifest .

  3. Dans le volet Propriétés, ouvrez la liste déroulante Document de départ, puis choisissez l’une des trois options (Excel, Word ou PowerPoint).

    Choisissez l’application cliente Office souhaitée : Excel, PowerPoint ou Word.

  4. Appuyez sur la touche F5. Ou sélectionnez Déboguer > Démarrer le débogage.

  5. Dans l’application Office, sélectionnez le groupe Afficher le complément dans l’authentification unique ASP.NET pour ouvrir le complément du volet Office.

  6. Sélectionnez Obtenir des noms de fichiers OneDrive. Si vous êtes connecté à Office avec un compte Microsoft 365 Éducation ou professionnel, ou un compte Microsoft, et que l’authentification unique fonctionne comme prévu, les 10 premiers noms de fichiers et de dossiers de votre OneDrive Entreprise s’affichent dans le volet Office. Si vous n’êtes pas connecté, ou si vous êtes dans un scénario qui ne prend pas en charge l’authentification unique, ou si l’authentification unique ne fonctionne pas pour une raison quelconque, vous serez invité à vous connecter. Une fois connecté, les noms des fichiers et des dossiers s’affichent.

Déploiement du complément

Lorsque vous êtes prêt à effectuer un déploiement sur un serveur intermédiaire ou de production, veillez à mettre à jour les zones suivantes dans la solution de projet.

  • Dans le fichier appsettings.json , remplacez le domaine par votre nom de domaine intermédiaire ou de production.
  • Mettez à jour toutes les références à localhost:7080 dans votre projet pour utiliser votre URL de préproduction ou de production.
  • Mettez à jour toutes les références à localhost:7080 dans votre inscription d’application Azure ou créez une nouvelle inscription à utiliser en préproduction ou en production.

Pour plus d’informations, consultez Héberger et déployer ASP.NET Core.

Voir aussi