Compartilhar via


Resolver problemas de compartilhamento de recursos entre origens no proxy de aplicativo do Microsoft Entra

O CORS (compartilhamento de recursos entre origens) pode apresentar desafios para os aplicativos e APIs que você publica por meio do proxy de aplicativo do Microsoft Entra. Esse artigo discute problemas e soluções de CORS do proxy de aplicativo do Microsoft Entra.

A segurança do navegador geralmente impede uma página da Web de fazer solicitações para outro domínio. Essa restrição é chamada de política de mesma origem. A política impede que um site mal-intencionado leia dados confidenciais de outro site. No entanto, às vezes, talvez seja interessante permitir que outros sites chamem sua API Web. CORS é um padrão W3C que direciona um servidor para permitir algumas solicitações entre origens e rejeitar outras.

Identificar um problema de CORS

Duas URLs terão a mesma origem se tiverem esquemas, hosts e portas idênticos (RFC (Solicitação de Comentários) 6454), como neste exemplo:

  • http://contoso.com/foo.html
  • http://contoso.com/bar.html

Essas URLs têm origens diferentes das duas anteriores:

  • http://contoso.net: domínio diferente
  • http://contoso.com:9000/foo.html: porta diferente
  • https://contoso.com/foo.html: esquema diferente
  • http://www.contoso.com/foo.html: subdomínio diferente

A política de mesma origem impede que os aplicativos acessem recursos de outras origens, a menos que usem os cabeçalhos de controle de acesso corretos. Se os cabeçalhos de CORS estiverem ausentes ou incorretos, as solicitações entre origens falharão.

Você pode identificar problemas de CORS usando as ferramentas de depuração do navegador:

  1. Abra o navegador e vá para o aplicativo Web.
  2. Selecione a chave F12 para abrir o console de depuração no DevTools.
  3. Tente reproduzir a transação e examine a mensagem do console. Uma violação de CORS produz um erro de console sobre a origem.

Na captura de tela a seguir, selecionar o botão Experimentar causou uma mensagem de erro CORS porque https://corswebclient-contoso.msappproxy.net não foi encontrado no cabeçalho Access-Control-Allow-Origin.

Captura de tela que mostra um exemplo de um problema de CORS.

Desafios do CORS com o proxy de aplicativo

O exemplo a seguir mostra um cenário típico de CORS do proxy de aplicativo do Microsoft Entra. O servidor interno hospeda um controlador da API Web CORSWebService e um CORSWebClient que chama CORSWebService. Uma solicitação de JavaScript e XML (AJAX) assíncrona é feita de CORSWebClient para CORSWebService.

Captura de tela que mostra uma solicitação local de mesma origem.

O aplicativo CORSWebClient funciona localmente, mas falha ou mostra um erro quando publicado por meio do proxy de aplicativo do Microsoft Entra. Se CORSWebClient e CORSWebService forem publicados como aplicativos separados, eles serão hospedados em domínios diferentes. Os diferentes domínios fazem solicitações AJAX de CORSWebClient para CORSWebService entre origens, fazendo com que elas falhem.

Captura de tela que mostra uma solicitação CORS de proxy de aplicativo.

Soluções para problemas de CORS em proxies de aplicativos

Você pode resolver o problema anterior do CORS de várias maneiras.

Opção 1: configurar um domínio personalizado

Use um proxy de aplicativo do Microsoft Entra domínio personalizado para publicar da mesma origem, sem fazer alterações nas origens, códigos ou cabeçalhos dos aplicativos.

Opção 2: publicar o diretório pai

Publique o diretório pai de ambos os aplicativos. Essa solução funcionará especialmente bem se você tiver apenas dois aplicativos no servidor Web. Em vez de publicar cada aplicativo separadamente, você pode publicar o diretório pai comum, o que resulta na mesma origem.

Os exemplos a seguir mostram as páginas de proxy de aplicação do Microsoft Entra para o app CORSWebClient. Quando a URL interna é definida como contoso.com/CORSWebClient, o aplicativo não pode fazer solicitações bem-sucedidas para o contoso.com/CORSWebService diretório, porque elas são de origem cruzada.

Captura de tela que mostra a publicação individual de um aplicativo.

Em vez disso, defina o valor da URL Interna para publicar o diretório pai, que inclui tanto os diretórios CORSWebClient quanto CORSWebService.

Captura de tela que mostra o processo de publicação de um diretório pai.

As URLs do aplicativo resultantes resolvem efetivamente o problema de CORS:

  • https://corswebclient-contoso.msappproxy.net/CORSWebService
  • https://corswebclient-contoso.msappproxy.net/CORSWebClient

Opção 3: atualizar cabeçalhos HTTP

Para corresponder à solicitação de origem, adicione um cabeçalho de resposta HTTP personalizado no serviço Web. Sites em execução no IIS (Serviços de Informações da Internet) usam o Gerenciador do IIS para modificar o cabeçalho.

Captura de tela que mostra a adição de um cabeçalho de resposta personalizado no Gerenciador do IIS.

A modificação não requer nenhuma alteração de código. Você pode verificá-lo em um rastreamento do Fiddler.

**Post the Header Addition**\
HTTP/1.1 200 OK\
Cache-Control: no-cache\
Pragma: no-cache\
Content-Type: text/plain; charset=utf-8\
Expires: -1\
Vary: Accept-Encoding\
Server: Microsoft-IIS/8.5 Microsoft-HTTPAPI/2.0\
**Access-Control-Allow-Origin: https://corswebclient-contoso.msappproxy.net**\
X-AspNet-Version: 4.0.30319\
X-Powered-By: ASP.NET\
Content-Length: 17

Opção 4: Modificar o aplicativo

Você pode alterar seu aplicativo para dar suporte ao CORS adicionando o Access-Control-Allow-Origin cabeçalho, com valores apropriados. A maneira de adicionar o cabeçalho depende da linguagem de código do aplicativo. Alterar o código requer mais esforço.

Opção 5: estender o tempo de vida do token de acesso

Alguns problemas de CORS não podem ser resolvidos. Por exemplo, seu aplicativo redireciona para login.microsoftonline.com para autenticar, e o token de acesso expira. A chamada CORS falhará. Uma solução alternativa para esse cenário é estender o tempo de vida do token de acesso para impedir que ele expire durante a sessão de um usuário. Para obter mais informações, consulte Tempos de vida de token configuráveis no Microsoft Entra ID.

Opção 6: aplicativo complexo

Para aplicativos que contêm diversos aplicativos web individuais em que solicitações de preflight (OPTIONS) são usadas, você pode publicar os apps através da funcionalidade de aplicativo complexo. Para obter mais informações, consulte Noções básicas sobre aplicativos complexos no proxy de aplicativo do Microsoft Entra.