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/files
REST. 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).
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.
Selecione Registros de aplicativos. Se não vir o ícone, procure "registo de aplicações" na barra de pesquisa.
A página Registros de aplicativo é exibida.
Selecione Novo registro.
A página Registrar um aplicativo é exibida.
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
.
- Defina Nome para
Selecione Registrar. É apresentada uma mensagem a indicar que o registo da aplicação foi criado.
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.
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.
No painel esquerdo, selecione Certificados & segredos. Em seguida, no separador Segredos do cliente, selecione Novo segredo do cliente.
É apresentado o painel Adicionar um segredo do cliente .
Adicione uma descrição para o segredo do cliente.
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.
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
No painel esquerdo, selecione Expor uma API.
É apresentado o painel Expor uma API .
Selecione Definir para gerar um URI de ID de aplicação.
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>
.Atualize o URI do ID da aplicação para
api://<fully-qualified-domain-name>/<app-id>
.- 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-name
api://
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.)
- O URI da ID do aplicativo está preenchido previamente com a ID do aplicativo (GUID) no formato
Adicionar um âmbito
Na página Expor uma API , selecione Adicionar um âmbito.
O painel Adicionar um âmbito é aberto.
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
profile
permissões ,openid
,Files.ReadWrite
eMail.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.
Defina o Estado como Ativado e, em seguida, selecione Adicionar âmbito.
O novo âmbito que definiu é apresentado no painel.
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
.Selecione Adicionar um aplicativo cliente.
É apresentado o painel Adicionar uma aplicação cliente .
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, adicione1fec8e78-bce4-4aaf-ab1b-5451cc387264
(Ambiente de trabalho do Microsoft Teams e Teams para dispositivos móveis) e5e3ce6c0-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)
-
Em Âmbitos autorizados, selecione a caixa
api://<fully-qualified-domain-name>/<app-id>/access_as_user
de verificação.Selecione Adicionar aplicativo.
Adicionar permissões do Microsoft Graph
No painel esquerdo, selecione Permissões da API.
O painel permissões da API é aberto.
Selecione Adicionar uma permissão.
O painel Pedir permissões da API é aberto.
Selecione Microsoft Graph.
Selecione Permissões delegadas.
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.ReadWrite
eMail.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.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.
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.
No painel esquerdo, selecione Manifesto.
É apresentado o manifesto da aplicação do Azure Active Directory.
Insira 2 como o valor da propriedade
accessTokenAcceptedVersion
.Selecione Salvar.
Uma mensagem é exibida no navegador informando que o manifesto foi atualizado com êxito.
Parabéns! Concluiu o registo de aplicações para ativar o SSO para o seu suplemento do Office.
Configurar a solução
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.
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.
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>
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.
Guarde e feche o ficheiro de manifesto.
No Explorador de Soluções, selecione o projeto Office-Add-in-ASPNET-SSO-web e abra o ficheiro appsettings.json .
Substitua o marcador de posição Enter_client_id_here pelo valor de ID da Aplicação (cliente) que guardou anteriormente.
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.
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
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
eawait
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.Na função
getUserFileNames
, substituaTODO 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 pelohandleClientSideErrors
.
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); } }
-
Na função
getUserFileNames
, substituaTODO 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); }
Na função
callRESTApi
, substituaTODO 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
Na função
handleSSOErrors
, substituaTODO 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; }
Na função
handleServerSideErrors
, substituaTODO 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; }
Na função
handleServerSideErrors
, substituaTODO 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 chamadasgetUserfileNames
adicionais novamente. QuandogetAccessToken
é 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; } }
- 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
Na função
handleServerSideErrors
, substituaTODO 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 agetAccessToken
qual devolve um token de acesso atualizado. AretryGetAccessToken
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);
- No caso raro de o token SSO original expirar, detetará esta condição de erro e chamará
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
Abra o
Program.cs
ficheiro e substituaTODO 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
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 naFilesController
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. }
- Especifica o
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); }
- Cria a
Executar a solução
No Visual Studio, no menu Compilar , selecione Limpar Solução. Quando terminar, abra o menu Build novamente e selecione Solução de Build.
No Explorador de Soluções, selecione o nó do projeto Office-Add-in-ASPNET-SSO-manifest .
No painel Propriedades, abra o menu suspenso Iniciar documento e escolha uma das três opções (Excel, Word ou PowerPoint).
Pressione F5. Em alternativa, selecione Depurar > Iniciar Depuração.
Na aplicação do Office, selecione o suplemento Mostrar no grupo ASP.NET SSO para abrir o suplemento do painel de tarefas.
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.