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 orienta você sobre o processo de habilitação do SSO (logon único) em um suplemento.

O exemplo mostra como criar as seguintes partes:

  • Código do lado do cliente que fornece um painel de tarefas que carrega 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 do SSO para chamar APIs REST do lado do servidor.
  • Código do lado do servidor que usa ASP.NET Core para fornecer uma única API /api/filesREST . O código do lado do servidor usa a Biblioteca de Autenticação da Microsoft para .NET (MSAL.NET) para todo o tratamento, autenticação e autorização de token.

O exemplo usa o SSO e o fluxo OBO (On-Behalf-Of) para obter tokens de acesso corretos e chamar APIs do Microsoft Graph. Se você não estiver familiarizado com o funcionamento desse fluxo, confira Como o SSO funciona 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 arquivos e pastas armazenados em OneDrive for Business na assinatura do Microsoft 365.

  • Um build do Microsoft 365 que aceita o conjunto de requisitos do IdentityAPI 1.3. Você pode se qualificar para uma assinatura de desenvolvedor Microsoft 365 E5, que inclui uma área restrita do desenvolvedor, por meio do Programa de Desenvolvedor do Microsoft 365; para obter detalhes, consulte as perguntas frequentes. A área restrita do desenvolvedor inclui uma assinatura do Microsoft Azure que você pode usar para registros de aplicativo em etapas posteriores neste artigo. Se preferir, você pode usar uma assinatura separada do Microsoft Azure para registros de aplicativo. Obtenha uma assinatura 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

Há duas versões do exemplo.

  • A pasta Begin é 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 Concluir contém o mesmo exemplo com todas as etapas de codificação deste artigo concluídas. Para usar a versão concluída, basta seguir as instruções neste artigo, mas substituir "Iniciar" por "Concluir" e ignorar as seções Codificar o lado do cliente e Codificar o lado do servidor.

Use os valores a seguir para espaços reservados para as etapas de registro de aplicativo 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

Registrar o suplemento com plataforma de identidade da Microsoft

Você precisa criar um registro de aplicativo no Azure que represente seu servidor Web. Isso permite o suporte à autenticação para que tokens de acesso adequados possam ser emitidos para o código do cliente no JavaScript. Esse registro dá suporte ao SSO no cliente e à autenticação de fallback usando a MSAL (Biblioteca de Autenticação da Microsoft).

  1. Entre no portal do Azure com as credenciais de administrador para sua locação do Microsoft 365. Por exemplo, MyName@contoso.onmicrosoft.com.

  2. Selecione Registros de aplicativos. Se você não vir o ícone, pesquise por "registro de aplicativo" na barra de pesquisa.

    A página inicial portal do Azure.

    A página Registros de aplicativo é exibida.

  3. Selecione Novo registro.

    Novo registro no painel Registros de aplicativo.

    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 com suportecomo Contas em qualquer diretório organizacional (qualquer diretório Azure AD - multilocatário) e contas pessoais da Microsoft (por exemplo, Skype, Xbox).
    • Defina o URI de redirecionamento para usar o SPA (aplicativo de página única) da plataforma e o URI como https://<fully-qualified-domain-name>/dialog.html.

    Registre um painel de aplicativo com o nome e a conta com suporte concluída.

  5. Selecione Registrar. Uma mensagem é exibida informando que o registro do aplicativo foi criado.

    Mensagem informando que o registro do aplicativo foi criado.

  6. Copie e salve os valores da ID do Aplicativo (cliente) e da ID do Diretório (locatário). Use ambos os valores nos procedimentos posteriores.

    Painel de registro de aplicativo da Contoso que exibe a ID do cliente e a ID do diretório.

Adicionar um segredo do cliente

Às vezes chamado de senha de aplicativo, um segredo do cliente é um valor de cadeia de caracteres que seu aplicativo pode usar no lugar de um certificado para se identificar.

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

    O painel Certificados & segredos.

    O painel Adicionar um segredo do cliente é exibido.

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

  3. Selecione uma expiração para o segredo ou especifique um tempo de vida personalizado.

    • O tempo de vida do segredo do cliente é limitado a dois anos (24 meses) ou menos. Você não pode especificar uma vida útil personalizada com mais de 24 meses.
    • A Microsoft recomenda que você defina um valor de expiração inferior a 12 meses.

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

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

Importante

Registre o valor do segredo para uso no código do aplicativo cliente. Esse valor secreto nunca será exibido novamente depois que você sair deste painel.

Expor uma API Web

  1. No painel esquerdo, selecione Expor uma API.

    O painel Expor uma API é exibido.

    Um painel Expor uma API de um registro de aplicativo.

  2. Selecione Definir para gerar um URI de ID do aplicativo.

    Defina o botão no painel Expor uma API do registro do aplicativo.

    A seção para definir o URI de ID do aplicativo é exibida com um URI de ID de Aplicativo gerado no formulário api://<app-id>.

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

    Edite o painel URI da ID do aplicativo 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 URI da ID do aplicativo deve ser: api://<fully-qualified-domain-name>/<app-id>
    • Insira o fully-qualified-domain-name entre api:// e <app-id> (que é um GUID). Por exemplo, api://contoso.com/<app-id>.
    • Se você estiver usando 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 da ID do aplicativo, consulte Atributo identifierUris do manifesto do aplicativo.

    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. (Esse erro também pode ocorrer se você não estiver conectado com credenciais de um administrador no locatário do Microsoft 365. Confira a etapa 2. Saia e entre novamente com credenciais de administrador e repita o processo da etapa 3.)

Adicionar um escopo

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

    Selecione Adicionar um botão de escopo.

    O painel Adicionar um escopo é aberto.

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

    Campo Descrição Values
    Nome do Escopo O nome do escopo. Uma convenção de nomenclatura de escopo comum é resource.operation.constraint. Para SSO, isso deve ser definido como access_as_user.
    Quem pode consentir Determina se o consentimento do administrador é necessário ou se os usuários podem consentir sem uma aprovação de administrador. Para aprender SSO e exemplos, recomendamos que você defina isso como administradores e usuários.

    Selecione Administradores somente para permissões com privilégios mais altos.
    Administração nome de exibição de consentimento Uma breve descrição da finalidade do escopo visível apenas para administradores. Read/write permissions to user files. Read permissions to user mail and profiles.
    Administração descrição do consentimento Uma descrição mais detalhada da permissão concedida pelo escopo que somente 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 de exibição de consentimento do usuário Uma breve descrição da finalidade do escopo. Mostrado aos usuários somente se você definir Quem pode consentir com administradores e usuários. Read/write permissions to your files. Read permissions to your mail and profile.
    Descrição do consentimento do usuário Uma descrição mais detalhada da permissão concedida pelo escopo. Mostrado aos usuários somente se você definir Quem pode consentir com administradores e usuários. Allow Office to have read/write permissions to your files, and read permissions to your mail and profile.
  3. Defina o Estado como Habilitado e selecione Adicionar escopo.

    Defina o estado como habilitado e selecione o botão adicionar escopo.

    O novo escopo definido é exibido no painel.

    O novo escopo exibido 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 um aplicativo cliente.

    O painel Adicionar um aplicativo cliente é exibido.

  5. Na ID do cliente, insiraea5a67f6-b6f3-4338-b240-c655ddc3cc8e. Esse valor autoriza previamente todos os pontos de extremidade do aplicativo do Microsoft Office. Se você também quiser pré-autorizar o Office quando usado dentro do Microsoft Teams, adicione 1fec8e78-bce4-4aaf-ab1b-5451cc387264 (Microsoft Teams desktop e Teams mobile) e 5e3ce6c0-2b1f-4285-8d4b-75ee78787346 (Teams na Web).

    Observação

    A ea5a67f6-b6f3-4338-b240-c655ddc3cc8e ID pré-autoriza o Office em todas as plataformas a seguir. Como alternativa, você pode inserir um subconjunto adequado das seguintes IDs se, por qualquer motivo, desejar negar a autorização ao Office em algumas plataformas. Se você fizer isso, deixe de fora as IDs das plataformas das quais deseja reter a autorização. Os usuários do suplemento nessas plataformas não poderão chamar suas APIs Web, mas outras funcionalidades no suplemento ainda funcionarão.

    • 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 Escopos autorizados, selecione a caixa de seleção api://<fully-qualified-domain-name>/<app-id>/access_as_user .

  7. Selecione Adicionar aplicativo.

    O painel Adicionar um aplicativo cliente.

Adicionar permissões do Microsoft Graph

  1. No painel esquerdo, selecione permissões de API.

    O painel permissões de API.

    O painel de permissões de API é aberto.

  2. Selecione Adicionar uma permissão.

    Adicionando uma permissão no painel de permissões de API.

    O painel Solicitar permissões de API é aberto.

  3. Selecione Microsoft Graph.

    O painel Solicitar permissões de API com o botão Microsoft Graph.

  4. Selecione Permissões delegadas.

    O painel Solicitar permissões de API com o botão permissões delegadas.

  5. Na caixa de pesquisa Selecionar permissões, pesquise as permissões que seu suplemento precisa. Por exemplo, para um suplemento do Outlook, você pode usar profile, openid, Files.ReadWritee Mail.Read.

    Observação

    A permissão User.Read pode já estar listada por padrão. É uma boa prática solicitar apenas permissões necessárias, portanto, recomendamos que você desmarque a caixa para essa permissão se o suplemento realmente não precisar dela.

  6. Selecione a caixa de seleção para cada permissão conforme ela aparece. Observe que as permissões não permanecerão visíveis na lista enquanto você seleciona cada uma delas. Depois de selecionar as permissões que seu suplemento precisa, selecione Adicionar permissões.

    O painel Solicitar permissões de API com algumas permissões selecionadas.

  7. Selecione Conceder consentimento de administrador para [nome do locatário]. Selecione Sim para a confirmação exibida.

Configurar a versão do token de acesso

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

Definir a versão do token de acesso

A versão do token de acesso poderá ser alterada se você escolher um tipo de conta diferente de Contas em qualquer diretório organizacional (Qualquer diretório Azure AD – Multilocatário) e contas pessoais da Microsoft (por exemplo, Skype, Xbox). Use as etapas a seguir para garantir que a versão do token de acesso esteja correta para o uso do SSO do Office.

  1. No painel esquerdo, selecione Manifesto.

    Selecione Manifesto do Azure.

    O manifesto do aplicativo do Azure Active Directory é exibido.

  2. Insira 2 como o valor da propriedade accessTokenAcceptedVersion.

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

  3. Selecione Salvar.

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

    Mensagem atualizada de manifesto.

Parabéns! Você concluiu o registro do aplicativo para habilitar o SSO para seu suplemento do Office.

Configurar a solução

  1. Na raiz da pasta Begin , abra o arquivo de solução (.sln) no Visual Studio. Clique com o botão direito do mouse no nó superior no Gerenciador de Soluções (no nó Solução, não em qualquer um dos nós do projeto) e selecione Configurar projetos de inicialização.

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

  3. Em Gerenciador de Soluções, escolha o projeto office-add-in-ASPNET-SSO-manifest e abra o arquivo de manifesto de suplemento "Office-Add-in-ASPNET-SSO.xml" e role até a parte inferior do arquivo. Logo acima da marca final </VersionOverrides> , você encontrará a marcação a seguir.

    <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 espaço reservado "Enter_client_ID_here" em ambos os lugares na marcação pela ID do aplicativo copiada quando você criou o registro do aplicativo Office-Add-in-ASPNET-SSO . Essa é a mesma ID que você usou para a ID do aplicativo no arquivo appsettings.json.

    Observação

    O <valor do recurso> é o URI da ID do Aplicativo que você define quando registrou o suplemento. A <seção Escopos> é usada apenas para gerar uma caixa de diálogo de consentimento se o suplemento for vendido por meio do AppSource.

  5. Salve e feche o arquivo de manifesto.

  6. Em Gerenciador de Soluções, escolha o projeto Office-Add-in-ASPNET-SSO-Web e abra o arquivo appsettings.json.

  7. Substitua o espaço reservado Enter_client_id_here pelo valor de ID do aplicativo (cliente) que você salvou anteriormente.

  8. Substitua o espaço reservado Enter_client_secret_here pelo valor de segredo do cliente que você salvou anteriormente.

    Observação

    Você também deve alterar o TenantId para dar suporte ao locatário único se você configurou o registro de aplicativo para locatário único. Substitua o valor Comum pela ID do aplicativo (cliente) para suporte de locatário único.

  9. Salve e feche o arquivo appsettings.json.

Codificar o lado do cliente

Obter o token de acesso e chamar a API REST do servidor de aplicativo

  1. No projeto Office-Add-in-ASPNETCore-WebAPI , abra o arquivo wwwroot\js\HomeES6.js . Ele já tem um código que garante que o Promises tenha suporte, mesmo no controle webview trident (Internet Explorer 11) e uma Office.onReady chamada para atribuir um manipulador ao único botão do suplemento.

    Observação

    Como o nome sugere, o HomeES6.js usa a sintaxe JavaScript ES6 porque usar async e await mostrar melhor a simplicidade essencial da API do SSO. Quando o servidor localhost é iniciado, esse arquivo é transpilado para a sintaxe ES5 para que o exemplo dê suporte a Trident.

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

    • Ele chama Office.auth.getAccessToken para obter o token de acesso do Office usando o SSO. Esse token conterá a identidade do usuário, bem como a permissão de acesso ao servidor de aplicativo.
    • O token de acesso é passado para callRESTApi o qual faz a chamada real para o servidor de aplicativo. Em seguida, o servidor de aplicativo usa o fluxo OBO para chamar o Microsoft Graph.
    • Todos os erros de chamada getAccessToken serão tratados por 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. Isso gravará a lista de nomes de arquivo 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:

    • Ele constrói um cabeçalho de autorização que contém o token de acesso. Isso confirma ao servidor de aplicativo que esse código cliente tem permissões de acesso para as APIs REST.
    • Ele solicita tipos de retorno JSON para que todos os valores retornados sejam tratados no JSON.
    • Todos os erros são passados 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);
     }
    

Manipular erros de SSO e erros de API REST do aplicativo

  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 retorna as declarações adicionais necessárias para concluir o consentimento. Esse código adiciona a authChallenge propriedade com as declarações e chamadas getUserfileNames adicionais novamente. Quando getAccessToken é chamado novamente com as declarações adicionais, o usuário recebe um prompt para todas as formas necessárias de autenticação.
    // 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 ter expirado, ele detectará essa condição de erro e chamará getUserFilenames novamente. Isso resulta em outra chamada para a getAccessToken qual retorna um token de acesso atualizado. A retryGetAccessToken variável conta as tentativas e atualmente está configurada para tentar novamente apenas uma vez.
    • Por fim, se um erro não puder ser tratado, o padrão será exibir 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 arquivo da pasta OneDrive do usuário. Cada chamada de API REST requer um token de acesso do cliente para garantir que o cliente correto esteja acessando seus dados. O token de acesso é trocado por um token do Microsoft Graph por meio do OBO (fluxo em nome de nome). O novo token do Microsoft Graph é armazenado em cache pela biblioteca MSAL.NET para chamadas de API subsequentes. Ele nunca é enviado fora do código do lado do servidor. A documentação de identidade da Microsoft refere-se a esse servidor como o servidor de camada intermediária porque ele está no meio do fluxo do código do lado do cliente para os serviços da Microsoft. Para obter mais informações, confira Solicitação de token de acesso de camada intermediária

Configurar o fluxo do Microsoft Graph e do OBO

  1. Abra o Program.cs arquivo e substitua TODO 8 pelo código a seguir. Sobre este código, observe:

    • Ele adiciona serviços necessários para lidar com a validação de token necessária para as APIs REST.
    • Ele adiciona suporte ao fluxo do Microsoft Graph e OBO na chamada para EnableTokenAcquisitionToCallDownstreamApi().AddMicrosoftGraph(...). O fluxo OBO é tratado automaticamente para você e o SDK do Microsoft Graph é fornecido aos controladores de API REST.
    • A configuração DownstreamApi é especificada no arquivo 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 arquivo FilesController.cs . substitua TODO 9 pelo código a seguir. Sobre este código, observe:

    • Ele especifica o [Authorize] atributo para garantir que o token de acesso seja validado para cada chamada para qualquer APIs REST na FilesController classe. Para obter mais informações, confira Validando tokens.
    • Ele especifica o [RequiredScope("access_as_user")] atributo para garantir que o cliente tenha o escopo de access_as_user correto no token de acesso.
    • O construtor inicializa o _graphServiceClient objeto para facilitar a chamada de 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:

    • Ele cria a /api/files API REST.
    • Ele lida com exceções de MSAL por classe MsalException .
    • Ele lida com exceções de chamadas do Microsoft API do Graph por meio 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 Build , selecione Limpar solução. Quando terminar, abra o menu Build novamente e selecione Solução de Build.

  2. Em Gerenciador de Soluções, selecione o nó de 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 o aplicativo cliente do Office desejado: Excel, PowerPoint ou Word.

  4. Pressione F5. Ou selecione Depurar > Iniciar Depuração.

  5. No aplicativo do Office, selecione Mostrar Suplemento no grupo SSO ASP.NET para abrir o suplemento do painel de tarefas.

  6. Selecione Obter nomes de arquivo do OneDrive. Se você estiver conectado ao Office com uma conta de trabalho ou Microsoft 365 Education ou ou uma conta microsoft, e o SSO estiver funcionando conforme o esperado, os primeiros 10 nomes de arquivo e pasta no OneDrive for Business serão exibidos no painel de tarefas. Se você não estiver conectado ou estiver em um cenário que não dá suporte ao SSO ou o SSO não estiver funcionando por nenhum motivo, você será solicitado a entrar. Depois de entrar, os nomes do arquivo e da pasta aparecem.

Implantar o suplemento

Quando estiver pronto para implantar em um servidor de preparo ou produção, atualize as seguintes áreas na solução de projeto.

  • No arquivo appsettings.json , altere o domínio para o nome do domínio de preparo ou de produção.
  • Atualize todas as referências para localhost:7080 todo o projeto para usar sua URL de preparo ou produção.
  • Atualize todas as referências no localhost:7080 registro de Azure App ou crie um novo registro para uso em preparo ou produção.

Para obter mais informações, consulte Hospedar e implantar ASP.NET Core.

Confira também