Partilhar via


Criar um Suplemento do Office com ASP.NET que use logon único

Os usuários podem entrar no Office, e o Suplemento Web do Office pode aproveitar esse processo de entrada para autorizá-los a acessar seu suplemento e o Microsoft Graph sem exigir que os eles entrem uma segunda vez. Este artigo explica-lhe o processo de ativação do início de sessão único (SSO) num suplemento.

O exemplo mostra-lhe como criar as seguintes partes:

  • Código do lado do cliente que fornece um painel de tarefas que é carregado no Microsoft Excel, Word ou PowerPoint. O código do lado do cliente chama a API getAccessToken() do Office JS para obter o token de acesso SSO para chamar as APIs REST do lado do servidor.
  • Código do lado do servidor que utiliza ASP.NET Core para fornecer uma única API /api/filesREST. O código do lado do servidor utiliza a Biblioteca de Autenticação da Microsoft para .NET (MSAL.NET) para todo o processamento de tokens, autenticação e autorização.

O exemplo utiliza o SSO e o fluxo On-Behalf-Of (OBO) para obter os tokens de acesso corretos e chamar as APIs do Microsoft Graph. Se não estiver familiarizado com o funcionamento deste fluxo, veja Como funciona o SSO no runtime para obter mais detalhes.

Pré-requisitos

  • Visual Studio 2019 ou posterior.

  • A carga de trabalho de desenvolvimento do Office/SharePoint ao configurar o Visual Studio.

  • Pelo menos alguns ficheiros e pastas armazenados no OneDrive para Empresas na sua subscrição do Microsoft 365.

  • Um build do Microsoft 365 que aceita o conjunto de requisitos do IdentityAPI 1.3. Pode qualificar-se para uma subscrição de programador do Microsoft 365 E5, que inclui um sandbox de programador, através do Programa para Programadores do Microsoft 365; para obter detalhes, veja as FAQ. O sandbox do programador inclui uma subscrição do Microsoft Azure que pode utilizar para registos de aplicações em passos posteriores neste artigo. Se preferir, pode utilizar uma subscrição separada do Microsoft Azure para registos de aplicações. Obtenha uma subscrição de avaliação no Microsoft Azure.

Configure o projeto inicial

Clone ou baixe o repositório em SSO com Suplemento ASPNET do Office.

Observação

Existem duas versões do exemplo.

  • A pasta Iniciar é um projeto inicial. A interface do usuário e outros aspectos do suplemento que não estão diretamente ligados ao SSO ou à autorização já estão prontos. As próximas seções deste artigo apresentam uma orientação passo a passo para concluir o projeto.
  • A pasta Complete contém o mesmo exemplo com todos os passos de codificação deste artigo concluídos. Para utilizar a versão concluída, basta seguir as instruções neste artigo, mas substituir "Começar" por "Concluído" e ignorar as secções Codificar o lado do cliente e Codificar o lado do servidor.

Utilize os seguintes valores para marcadores de posição para os passos de registo de aplicações subsequentes.

Espaço reservado Valor
<add-in-name> Office-Add-in-ASPNET-SSO
<fully-qualified-domain-name> localhost:44355
Permissões do Microsoft Graph perfil, openid, Files.Read

Registar o suplemento na plataforma de identidades da Microsoft

Tem de criar um registo de aplicações no Azure que represente o servidor Web. Isto permite o suporte de autenticação para que os tokens de acesso adequados possam ser emitidos para o código de cliente no JavaScript. Este registo suporta o SSO no cliente e a autenticação de contingência com a Biblioteca de Autenticação da Microsoft (MSAL).

  1. Inicie sessão no portal do Azure com as credenciais de administrador para o seu inquilino do Microsoft 365. Por exemplo, MyName@contoso.onmicrosoft.com.

  2. Selecione Registros de aplicativos. Se não vir o ícone, procure "registo de aplicações" na barra de pesquisa.

    A home page do portal do Azure.

    A página Registros de aplicativo é exibida.

  3. Selecione Novo registro.

    Novo registo no painel Registos de aplicações.

    A página Registrar um aplicativo é exibida.

  4. Na página Registrar um aplicativo, defina os valores da seguinte forma.

    • Defina Nome para <add-in-name>.
    • Defina Tipos de conta suportados como Contas em qualquer diretório organizacional (qualquer diretório do Azure AD - multi-inquilino) e contas Microsoft pessoais (por exemplo, Skype, Xbox).
    • Defina o URI de Redirecionamento para utilizar a aplicação de página única (SPA) da plataforma e o URI como https://<fully-qualified-domain-name>/dialog.html.

    Registar um painel de aplicação com o nome e a conta suportada concluídas.

  5. Selecione Registrar. É apresentada uma mensagem a indicar que o registo da aplicação foi criado.

    Mensagem a indicar que o registo da aplicação foi criado.

  6. Copie e guarde os valores do ID da Aplicação (cliente) e do ID do Diretório (inquilino). Use ambos os valores nos procedimentos posteriores.

    Painel de registo de aplicações da Contoso a apresentar o ID de cliente e o ID do diretório.

Adicionar um segredo do cliente

Por vezes denominado palavra-passe de aplicação, um segredo do cliente é um valor de cadeia que a sua aplicação pode utilizar em vez de um certificado para identificar a própria identidade.

  1. No painel esquerdo, selecione Certificados & segredos. Em seguida, no separador Segredos do cliente, selecione Novo segredo do cliente.

    O painel Certificados & segredos.

    É apresentado o painel Adicionar um segredo do cliente .

  2. Adicione uma descrição para o segredo do cliente.

  3. Selecione uma expiração para o segredo ou especifique uma duração personalizada.

    • A duração do segredo do cliente está limitada a dois anos (24 meses) ou menos. Não pode especificar uma duração personalizada superior a 24 meses.
    • A Microsoft recomenda que defina um valor de expiração inferior a 12 meses.

    Adicione um painel de segredos do cliente com a descrição e expira concluído.

  4. Selecione Adicionar. O novo segredo é criado e o valor é apresentado temporariamente.

Importante

Registe o valor do segredo para utilização no código da aplicação cliente. Este valor secreto nunca mais é apresentado depois de sair deste painel.

Expor uma API Web

  1. No painel esquerdo, selecione Expor uma API.

    É apresentado o painel Expor uma API .

    Um registo de aplicação expõe um painel de API.

  2. Selecione Definir para gerar um URI de ID de aplicação.

    Botão Definir no painel Expor uma API do registo de aplicações.

    A secção para definir o URI do ID da aplicação é apresentada com um URI de ID da Aplicação gerado no formulário api://<app-id>.

  3. Atualize o URI do ID da aplicação para api://<fully-qualified-domain-name>/<app-id>.

    Edite o painel URI do ID da Aplicação com a porta localhost definida como 44355.

    • O URI da ID do aplicativo está preenchido previamente com a ID do aplicativo (GUID) no formato api://<app-id>.
    • O formato do URI do ID da aplicação deve ser: api://<fully-qualified-domain-name>/<app-id>
    • Insira entre fully-qualified-domain-nameapi:// e <app-id> (que é um GUID). Por exemplo, api://contoso.com/<app-id>.
    • Se estiver a utilizar localhost, o formato deverá ser api://localhost:<port>/<app-id>. Por exemplo, api://localhost:3000/c6c1f32b-5e55-4997-881a-753cc1d563b7.

    Para obter detalhes adicionais do URI do ID da aplicação, veja Atributo identifierUris do manifesto da aplicação.

    Observação

    Se você receber um erro dizendo que o domínio já pertence a alguém, mas você é o seu proprietário, siga o procedimento em Início Rápido: Adicionar um domínio personalizado ao Azure Active Directory para registrá-lo e, em seguida, repita esta etapa. (Este erro também pode ocorrer se não tiver sessão iniciada com credenciais de um administrador no inquilino do Microsoft 365. Veja o passo 2. Termine sessão e inicie sessão novamente com as credenciais de administrador e repita o processo no passo 3.)

Adicionar um âmbito

  1. Na página Expor uma API , selecione Adicionar um âmbito.

    Selecione Adicionar um botão de âmbito.

    O painel Adicionar um âmbito é aberto.

  2. No painel Adicionar um âmbito , especifique os atributos do âmbito. A tabela seguinte mostra valores de exemplo para e o suplemento do Outlook que requer as profilepermissões , openid, Files.ReadWritee Mail.Read . Modifique o texto para corresponder às permissões que o seu suplemento precisa.

    Campo Descrição Values
    Nome do Escopo O nome do âmbito. Uma convenção de nomenclatura de âmbito comum é resource.operation.constraint. Para O SSO, tem de ser definido como access_as_user.
    Quem pode consentir Determina se o consentimento do administrador é necessário ou se os utilizadores podem consentir sem uma aprovação de administrador. Para aprender SSO e exemplos, recomendamos que defina esta opção para Administradores e utilizadores.

    Selecione Administradores apenas para permissões com privilégios mais elevados.
    Nome a apresentar do consentimento do administrador Uma breve descrição da finalidade do âmbito visível apenas para os administradores. Read/write permissions to user files. Read permissions to user mail and profiles.
    Descrição do consentimento do administrador Uma descrição mais detalhada da permissão concedida pelo âmbito que apenas os administradores veem. 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.
    Nome a apresentar do consentimento do utilizador Uma breve descrição da finalidade do âmbito. Mostrado aos utilizadores apenas se definir Quem pode dar consentimento a Administradores e utilizadores. Read/write permissions to your files. Read permissions to your mail and profile.
    Descrição do consentimento do utilizador Uma descrição mais detalhada da permissão concedida pelo âmbito. Mostrado aos utilizadores apenas se definir Quem pode dar consentimento a Administradores e utilizadores. Allow Office to have read/write permissions to your files, and read permissions to your mail and profile.
  3. Defina o Estado como Ativado e, em seguida, selecione Adicionar âmbito.

    Defina o estado como ativado e selecione o botão adicionar âmbito.

    O novo âmbito que definiu é apresentado no painel.

    O novo âmbito apresentado no painel Expor uma API.

    Observação

    A parte de domínio do Nome de escopo exibidos logo abaixo do campo de texto deve corresponder automaticamente ao URI de ID do aplicativo definidos na etapa anterior com /access_as_user acrescentado ao final; por exemplo, api://localhost:6789/c6c1f32b-5e55-4997-881a-753cc1d563b7/access_as_user.

  4. Selecione Adicionar um aplicativo cliente.

    Selecione Adicionar uma aplicação cliente.

    É apresentado o painel Adicionar uma aplicação cliente .

  5. No ID de Cliente, introduza ea5a67f6-b6f3-4338-b240-c655ddc3cc8e. Este valor pré-autoriza todos os pontos finais de aplicações do Microsoft Office. Se também pretender pré-autorizar o Office quando utilizado no Microsoft Teams, adicione 1fec8e78-bce4-4aaf-ab1b-5451cc387264 (Ambiente de trabalho do Microsoft Teams e Teams para dispositivos móveis) e 5e3ce6c0-2b1f-4285-8d4b-75ee78787346 (Teams na Web).

    Observação

    O ea5a67f6-b6f3-4338-b240-c655ddc3cc8e ID pré-autoriza o Office em todas as seguintes plataformas. Em alternativa, pode introduzir um subconjunto adequado dos seguintes IDs se, por qualquer motivo, quiser negar a autorização ao Office em algumas plataformas. Se o fizer, deixe de fora os IDs das plataformas a partir das quais pretende reter a autorização. Os utilizadores do seu suplemento nessas plataformas não poderão chamar as suas APIs Web, mas outras funcionalidades no seu suplemento continuarão a funcionar.

    • d3590ed6-52b3-4102-aeff-aad2292ab01c (Microsoft Office)
    • 93d53678-613d-4013-afc1-62e9e444a0a5(Office na Web)
    • bc59ab01-8403-45c6-8796-ac3ef710b3e3(Outlook na Web)
  6. Em Âmbitos autorizados, selecione a caixa api://<fully-qualified-domain-name>/<app-id>/access_as_user de verificação.

  7. Selecione Adicionar aplicativo.

    O painel Adicionar uma aplicação cliente.

Adicionar permissões do Microsoft Graph

  1. No painel esquerdo, selecione Permissões da API.

    O painel permissões da API.

    O painel permissões da API é aberto.

  2. Selecione Adicionar uma permissão.

    Adicionar uma permissão no painel de permissões da API.

    O painel Pedir permissões da API é aberto.

  3. Selecione Microsoft Graph.

    O painel Pedir permissões da API com o botão Microsoft Graph.

  4. Selecione Permissões delegadas.

    O painel Pedir permissões da API com o botão permissões delegadas.

  5. Na caixa de pesquisa Selecionar permissões , procure as permissões de que o suplemento precisa. Por exemplo, para um suplemento do Outlook, pode utilizar profile, openid, Files.ReadWritee Mail.Read.

    Observação

    A permissão User.Read pode já estar listada por padrão. É uma boa prática pedir apenas as permissões necessárias, pelo que recomendamos que desmarque a caixa para esta permissão se o seu suplemento não precisar realmente da mesma.

  6. Selecione a caixa de verificação para cada permissão tal como é apresentada. Tenha em atenção que as permissões não permanecerão visíveis na lista à medida que seleciona cada uma delas. Depois de selecionar as permissões de que o suplemento precisa, selecione Adicionar permissões.

    O painel Pedir permissões da API com algumas permissões selecionadas.

  7. Selecione Conceder consentimento do administrador para [nome do inquilino]. Selecione Sim para a confirmação apresentada.

Configurar a versão do token de acesso

Você deve definir a versão do token de acesso aceitável para seu aplicativo. Esta configuração é efetuada no manifesto da aplicação do Azure Active Directory.

Definir a versão do token de acesso

A versão do token de acesso pode ser alterada se escolher um tipo de conta diferente de Contas em qualquer diretório organizacional (qualquer diretório do Azure AD - Multi-inquilino) e contas Microsoft pessoais (por exemplo, Skype, Xbox). Utilize os seguintes passos para garantir que a versão do token de acesso está correta para a utilização do SSO do Office.

  1. No painel esquerdo, selecione Manifesto.

    Selecione Manifesto do Azure.

    É apresentado o manifesto da aplicação do Azure Active Directory.

  2. Insira 2 como o valor da propriedade accessTokenAcceptedVersion.

    Valor para a versão do token de acesso aceite.

  3. Selecione Salvar.

    Uma mensagem é exibida no navegador informando que o manifesto foi atualizado com êxito.

    Mensagem atualizada do manifesto.

Parabéns! Concluiu o registo de aplicações para ativar o SSO para o seu suplemento do Office.

Configurar a solução

  1. Na raiz da pasta Iniciar , abra o ficheiro de solução (.sln) no Visual Studio. Clique com o botão direito do rato (ou selecione sem soltar) no nó superior no Explorador de Soluções (o nó Solução, não nenhum dos nós do projeto) e, em seguida, selecione Definir projetos de arranque.

  2. Em Propriedades Comuns, selecione Projeto de Inicialização e Vários projetos de inicialização. Certifique-se de que a Ação para ambos os projetos está definida como Iniciar e que o projeto Office-Add-in-ASPNETCoreWebAPI está listado em primeiro lugar. Feche a caixa de diálogo.

  3. No Explorador de Soluções, selecione o projeto Office-Add-in-ASPNET-SSO-manifest e abra o ficheiro de manifesto do suplemento "Office-Add-in-ASPNET-SSO.xml" e, em seguida, desloque-se para a parte inferior do ficheiro. Logo acima da etiqueta de fim </VersionOverrides> , encontrará a seguinte marcação.

    <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. Substitua o marcador de posição "Enter_client_ID_here" em ambos os locais na marcação pelo ID da Aplicação que copiou quando criou o registo da aplicação Office-Add-in-ASPNET-SSO . Este é o mesmo ID que utilizou para o ID da aplicação no ficheiro appsettings.json.

    Observação

    O <Valor do recurso> é o URI do ID da Aplicação que definiu quando registou o suplemento. A <secção Âmbitos> é utilizada apenas para gerar uma caixa de diálogo de consentimento se o suplemento for vendido através do AppSource.

  5. Guarde e feche o ficheiro de manifesto.

  6. No Explorador de Soluções, selecione o projeto Office-Add-in-ASPNET-SSO-web e abra o ficheiro appsettings.json .

  7. Substitua o marcador de posição Enter_client_id_here pelo valor de ID da Aplicação (cliente) que guardou anteriormente.

  8. Substitua o marcador de posição Enter_client_secret_here pelo valor do segredo do cliente que guardou anteriormente.

    Observação

    Também tem de alterar o TenantId para suportar um inquilino único se tiver configurado o registo da aplicação para um único inquilino. Substitua o valor Comum pelo ID da Aplicação (cliente) para o suporte de inquilino único.

  9. Guarde e feche o ficheiro appsettings.json.

Codificar o lado do cliente

Obter o token de acesso e chamar a API REST do servidor de aplicações

  1. No projeto Office-Add-in-ASPNETCore-WebAPI , abra o ficheiro wwwroot\js\HomeES6.js . Já tem código que garante que as Promessas são suportadas, mesmo no controlo da vista Web Trident (Internet Explorer 11) e uma Office.onReady chamada para atribuir um processador ao único botão do suplemento.

    Observação

    Como o nome sugere, o HomeES6.js utiliza a sintaxe JavaScript ES6 porque utilizar async e await melhor mostra a simplicidade essencial da API de SSO. Quando o servidor localhost é iniciado, este ficheiro é transpiado para a sintaxe ES5 para que o exemplo suporte Trident.

  2. Na função getUserFileNames, substitua TODO 1 pelo seguinte código. Sobre este código, observe:

    • Office.auth.getAccessToken Chama para obter o token de acesso do Office através do SSO. Este token irá conter a identidade do utilizador, bem como a permissão de acesso ao servidor da aplicação.
    • O token de acesso é transmitido para callRESTApi o qual faz a chamada real para o servidor de aplicações. Em seguida, o servidor de aplicações utiliza o fluxo OBO para chamar o Microsoft Graph.
    • Todos os erros da chamada getAccessToken serão processados pelo 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. Na função getUserFileNames, substitua TODO 2 pelo seguinte código. Esta ação irá escrever a lista de nomes de ficheiros no documento.

     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. Na função callRESTApi, substitua TODO 3 pelo seguinte código. Sobre este código, observe:

    • Constrói um cabeçalho de autorização que contém o token de acesso. Isto confirma ao servidor da aplicação que este código de cliente tem permissões de acesso às APIs REST.
    • Pede tipos de devolução JSON, para que todos os valores devolvidos sejam processados em JSON.
    • Todos os erros são transmitidos para handleServerSideErrors o processamento.
     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);
     }
    

Lidar com erros de SSO e erros da API REST da aplicação

  1. Na função handleSSOErrors, substitua TODO 4 pelo seguinte código. Para saber mais sobre esses erros, confira Solucionar problemas de SSO em suplementos do Office em.

     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. Na função handleServerSideErrors, substitua TODO 5 pelo seguinte código.

    // 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. Na função handleServerSideErrors, substitua TODO 6 pelo seguinte código. Sobre este código, observe:

    • Em alguns casos, é necessário consentimento adicional, como 2FA. A identidade da Microsoft devolve as afirmações adicionais necessárias para concluir o consentimento. Este código adiciona a authChallenge propriedade com as afirmações e chamadas getUserfileNames adicionais novamente. Quando getAccessToken é chamado novamente com as afirmações adicionais, o utilizador recebe um pedido para todas as formas de autenticação necessárias.
    // 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. Na função handleServerSideErrors, substitua TODO 7 pelo seguinte código. Sobre este código, observe:

    • No caso raro de o token SSO original expirar, detetará esta condição de erro e chamará getUserFilenames novamente. Isto resulta noutra chamada para a getAccessToken qual devolve um token de acesso atualizado. A retryGetAccessToken variável conta as repetições e está atualmente configurada para tentar apenas uma vez.
    • Por fim, se não for possível processar um erro, a predefinição é apresentar o erro no painel de tarefas.
    // 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. Salve o arquivo.

Codifique o lado do servidor

O código do lado do servidor é um servidor ASP.NET Core que fornece APIs REST para o cliente chamar. Por exemplo, a API /api/files REST obtém uma lista de nomes de ficheiro da pasta do OneDrive do utilizador. Cada chamada à API REST requer um token de acesso do cliente para garantir que o cliente correto está a aceder aos respetivos dados. O token de acesso é trocado por um token do Microsoft Graph através do fluxo On-Behalf-Of (OBO). O novo token do Microsoft Graph é colocado em cache pela biblioteca de MSAL.NET para chamadas à API subsequentes. Nunca é enviado fora do código do lado do servidor. A documentação de identidade da Microsoft refere-se a este servidor como o servidor de camada média porque está no meio do fluxo do código do lado do cliente para os serviços Microsoft. Para obter mais informações, veja Pedido de token de acesso de camada média

Configurar o Microsoft Graph e o fluxo OBO

  1. Abra o Program.cs ficheiro e substitua TODO 8 pelo seguinte código. Sobre este código, observe:

    • Adiciona os serviços necessários para processar a validação de tokens necessária para as APIs REST.
    • Adiciona suporte de fluxo do Microsoft Graph e OBO na chamada para EnableTokenAcquisitionToCallDownstreamApi().AddMicrosoftGraph(...). O fluxo OBO é processado automaticamente e o SDK do Microsoft Graph é fornecido aos controladores da API REST.
    • A configuração DownstreamApi é especificada no ficheiro appsettings.json .
    // Add services to the container.
    builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
                    .EnableTokenAcquisitionToCallDownstreamApi()
                        .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi"))
                        .AddInMemoryTokenCaches();
    
    

Criar a API REST /api/filenames

  1. Na pasta Controladores , abra o ficheiro FilesController.cs . substitua TODO 9 pelo seguinte código. Sobre este código, observe:

    • Especifica o [Authorize] atributo para garantir que o token de acesso é validado para cada chamada a quaisquer APIs REST na FilesController classe . Para obter mais informações, veja Validar tokens.
    • Especifica o [RequiredScope("access_as_user")] atributo para garantir que o cliente tem o âmbito de access_as_user correto no token de acesso.
    • O construtor inicializa o _graphServiceClient objeto para facilitar a chamada das APIs REST do 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. Substitua TODO 10 pelo código a seguir. Sobre este código, observe:

    • Cria a /api/files API REST.
    • Processa exceções do MSAL através MsalException da classe .
    • Processa as exceções das chamadas à Microsoft Graph API através da 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);
        }
    

Executar a solução

  1. No Visual Studio, no menu Compilar , selecione Limpar Solução. Quando terminar, abra o menu Build novamente e selecione Solução de Build.

  2. No Explorador de Soluções, selecione o nó do projeto Office-Add-in-ASPNET-SSO-manifest .

  3. No painel Propriedades, abra o menu suspenso Iniciar documento e escolha uma das três opções (Excel, Word ou PowerPoint).

    Escolha a aplicação cliente do Office pretendida: Excel, PowerPoint ou Word.

  4. Pressione F5. Em alternativa, selecione Depurar > Iniciar Depuração.

  5. Na aplicação do Office, selecione o suplemento Mostrar no grupo ASP.NET SSO para abrir o suplemento do painel de tarefas.

  6. Selecione Obter Nomes de Ficheiro do OneDrive. Se tiver sessão iniciada no Office com uma conta do Microsoft 365 Educação ou profissional ou com uma conta Microsoft e o SSO estiver a funcionar conforme esperado, os primeiros 10 nomes de ficheiros e pastas no seu OneDrive para Empresas são apresentados no painel de tarefas. Se não tiver sessão iniciada ou se estiver num cenário que não suporta SSO ou se o SSO não estiver a funcionar por qualquer motivo, ser-lhe-á pedido para iniciar sessão. Depois de iniciar sessão, os nomes dos ficheiros e pastas são apresentados.

Implantar o suplemento

Quando estiver pronto para implementar num servidor de teste ou de produção, certifique-se de que atualiza as seguintes áreas na solução do projeto.

  • No ficheiro appsettings.json , altere o domínio para o nome de domínio de teste ou produção.
  • Atualize todas as referências para localhost:7080 ao longo do projeto para utilizar o URL de teste ou de produção.
  • Atualize as referências a localhost:7080 no registo da Aplicação do Azure ou crie um novo registo para utilização em teste ou produção.

Para obter mais informações, veja Alojar e implementar ASP.NET Core.

Confira também