Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Serviço de Aplicações do Azure fornece autenticação incorporada (frequentemente chamada de "EasyAuth") que gere o início de sessão do utilizador antes de os pedidos chegarem à sua aplicação. O Data API Builder pode ler a informação de identidade que o App Service injeta, permitindo a autenticação sem gerir os tokens diretamente.
Importante
O AppService fornecedor confia nos cabeçalhos de identidade encaminhados pelo EasyAuth. Garanta que os clientes não conseguem contornar o EasyAuth e aceder diretamente ao Data API Builder.
Warning
Use o fornecedor de autenticação AppService apenas quando estiver hospedado em Serviço de Aplicações do Azure ou Funções do Azure no App Service. Definir este fornecedor num host Windows nu ou num ambiente sem App Service causa falhas de arranque porque a infraestrutura EasyAuth necessária está ausente. Para testes locais, simule o EasyAuth enviando manualmente o X-MS-CLIENT-PRINCIPAL cabeçalho. Consulte Testar localmente com X-MS-CLIENT-PRINCIPAL.
Fluxo de autenticação
Quando o Data API Builder corre atrás do Serviço de Aplicações do Azure com a autenticação ativada, o App Service gere o fluxo OAuth e passa a informação de identidade através de cabeçalhos HTTP:
| Fase | O que acontece |
|---|---|
| Autenticação do utilizador | O App Service interceta pedidos não autenticados e redireciona para o fornecedor de identidade |
| Injeção de identidade | Após a autenticação, o App Service adiciona o X-MS-CLIENT-PRINCIPAL cabeçalho |
| Processamento DAB | Data API builder Base64 decodifica o cabeçalho JSON e constrói a ClaimsPrincipal partir do claims array |
| Authorization | O DAB usa ClaimsPrincipal.IsInRole() para validar o X-MS-API-ROLE cabeçalho, depois avalia permissões e políticas |
Pré-requisitos
- Uma assinatura do Azure
- Serviço de Aplicações do Azure ou Funções do Azure (na infraestrutura App Service)
- CLI do construtor de APIs de dados instalado (guia de instalação)
- Um existente
dab-config.jsoncom no mínimo uma entidade
Referência rápida
| Configuração | Valor |
|---|---|
| Provider | AppService |
| Cabeçalho de identidade |
X-MS-CLIENT-PRINCIPAL (JSON codificado em Base64) |
| Cabeçalho de seleção de função | X-MS-API-ROLE |
| Suporta reivindicações personalizadas | Sim |
| Testes locais | Sim (definir cabeçalhos manualmente) |
Passo 1: Ativar a autenticação do App Service
Configurar autenticação no Serviço de Aplicações do Azure:
No portal Azure, navegue até ao seu App Service.
Selecione Configurações>Autenticação.
Selecione Adicionar provedor de identidade.
Escolha a Microsoft (ou outro fornecedor suportado).
Configurar as configurações:
- Tipo de registo da aplicação: Criar um novo ou selecionar o existente
- Tipos de conta suportados: Escolha com base no seu cenário
- Restringir acesso: Exigir autenticação
Selecione Adicionar.
Sugestão
A autenticação por App Service funciona com múltiplos fornecedores de identidade, incluindo Microsoft, Google, Facebook, Twitter e OpenID Connect.
Passo 2: Configurar Data API Builder
Defina o fornecedor de autenticação para AppService:
CLI
dab configure \
--runtime.host.authentication.provider AppService
Configuração resultante
{
"runtime": {
"host": {
"authentication": {
"provider": "AppService"
}
}
}
}
Observação
Ao contrário dos EntraID, /, AzureAD ou Custom fornecedores, AppService não requer definições jwt.audience ou jwt.issuer. O App Service valida o token antes de passar a informação de identidade para o DAB.
Passo 3: Configurar permissões de entidade
Definir permissões para funções. O Data API Builder avalia as funções via ClaimsPrincipal.IsInRole(), que verifica as declarações extraídas do cabeçalho X-MS-CLIENT-PRINCIPAL. Inclua declarações de função no array claims com o tipo de declaração de função adequado.
Exemplo de configuração
# Allow authenticated users to read
dab update Book \
--permissions "authenticated:read"
# Allow editors to create and update
dab update Book \
--permissions "editor:create,read,update"
Configuração resultante
{
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "editor",
"actions": ["create", "read", "update"]
}
]
}
}
}
Passo 4: Teste localmente com X-MS-CLIENT-PRINCIPAL
Pode testar a autenticação do App Service localmente, fornecendo manualmente o X-MS-CLIENT-PRINCIPAL cabeçalho. Esta abordagem simula o que o EasyAuth encaminha para a sua aplicação e permite-lhe testar o comportamento baseado em funções e declarações, sem necessidade de implementação no Azure.
Crie um cliente principal
O X-MS-CLIENT-PRINCIPAL cabeçalho contém um objeto JSON codificado em Base64. O Data API builder analisa as seguintes propriedades:
{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "Alice Smith" },
{ "typ": "email", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" },
{ "typ": "http://schemas.microsoft.com/identity/claims/objectidentifier", "val": "abc-123-def" }
]
}
Codificar o elemento principal
Codifica o JSON como Base64. Pode usar qualquer ferramenta:
PowerShell::
$json = @'
{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" }
]
}
'@
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($json))
Bash:
echo '{
"auth_typ": "aad",
"name_typ": "name",
"role_typ": "roles",
"claims": [
{ "typ": "name", "val": "alice@contoso.com" },
{ "typ": "roles", "val": "authenticated" },
{ "typ": "roles", "val": "editor" }
]
}' | base64
Envie um pedido com o cabeçalho
curl -X GET "http://localhost:5000/api/Book" \
-H "X-MS-CLIENT-PRINCIPAL: eyJpZGVudGl0eVByb3ZpZGVyIjoiYWFkIiwidXNlcklkIjoidXNlci0xMjM0NSIsInVzZXJEZXRhaWxzIjoiYWxpY2VAY29udG9zby5jb20iLCJ1c2VyUm9sZXMiOlsiYXV0aGVudGljYXRlZCIsImVkaXRvciJdfQ==" \
-H "X-MS-API-ROLE: editor"
Estrutura X-MS-CLIENT-PRINCIPAL
O Data API builder analisa as seguintes propriedades do principal cliente:
| Propriedade | Tipo | Descrição |
|---|---|---|
auth_typ |
cadeia (de caracteres) | O tipo de autenticação (por exemplo, aad). Exigido para que a identidade seja considerada autenticada. |
name_typ |
cadeia (de caracteres) | (Opcional) O tipo de reivindicação usado para o nome do utilizador |
role_typ |
cadeia (de caracteres) | (Opcional) O tipo de reivindicação usado para as funções (por defeito roles) |
claims |
objeto[] | Matriz de reivindicações com propriedades typ e val. Os papéis devem ser incluídos aqui como reivindicações. |
Importante
As funções são avaliadas via ClaimsPrincipal.IsInRole(), que verifica o array claims para identificar reivindicações que correspondam ao role_typ. Inclua cada função como uma entrada separada na reivindicação (por exemplo, { "typ": "roles", "val": "editor" }).
Utilização de declarações em políticas de base de dados
Com o fornecedor da AppService, pode usar declarações nas políticas da base de dados. Esta capacidade permite segurança ao nível das linhas com base na identidade do utilizador.
Exemplo: Filtrar por ID de objeto de utilizador
Este exemplo utiliza a afirmação oid (identificador de objeto), que o Microsoft Entra ID inclui nos tokens:
{
"entities": {
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": [
{
"action": "read",
"policy": {
"database": "@claims.oid eq @item.customerId"
}
}
]
}
]
}
}
}
Sugestão
Tipos comuns de reivindicações do Microsoft Entra ID incluem oid (ID de objeto), email, name, e preferred_username. Use o formulário exato de tipo de reclamação do seu fornecedor de identidade.
Referências disponíveis para reivindicações
As referências de reivindicações usam a cadeia exata de tipo de reivindicação do claims array:
| Referência da reivindicação | Descrição |
|---|---|
@claims.<claim-type> |
Quaisquer afirmações do claims array, correspondidas pela propriedade typ |
Por exemplo, se o seu principal incluir { "typ": "email", "val": "alice@contoso.com" }, utilize @claims.email na sua política. O tipo de reclamação deve corresponder exatamente.
Pedidos anónimos
Quando o App Service permite pedidos não autenticados, ou ao testar localmente sem o cabeçalho X-MS-CLIENT-PRINCIPAL, o middleware de autenticação do Data API Builder define o cabeçalho X-MS-API-ROLE para anonymous automaticamente. Os pedidos são avaliados utilizando a função anonymous.
# No principal header = anonymous role (X-MS-API-ROLE set automatically)
curl -X GET "http://localhost:5000/api/Book"
Para acesso anónimo a funcionalidades, a sua entidade deve ter permissões para a anonymous função:
{
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
}
]
}
Troubleshooting
| Symptom | Causa possível | Solução |
|---|---|---|
401 Unauthorized (ou redirecionar para iniciar sessão) |
O EasyAuth bloqueou o pedido antes de chegar ao DAB | Inicie sessão através do EasyAuth ou envie credenciais válidas; verificar as definições de autenticação do Serviço de Aplicações |
403 Forbidden |
Função não nas permissões | Adicionar a função às permissões da entidade |
403 Forbidden |
X-MS-API-ROLE não consta nas funções do utilizador |
Assegure que o valor do cabeçalho corresponde a uma declaração de função no array do principal claims |
| Reivindicações não disponíveis | Matriz em falta claims no principal do cliente |
Adicionar reivindicações ao X-MS-CLIENT-PRINCIPAL JSON |
| Papel não reconhecido | Papéis que não estão na matriz claims |
Adicionar declarações de função corretamente com role_typ (por exemplo, { "typ": "roles", "val": "editor" }) |
| Falhas nos testes locais | Cabeçalho não codificado em Base64 | Codifica corretamente o JSON antes de enviar |
Exemplo de configuração completa
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"connection-string": "@env('SQL_CONNECTION_STRING')"
},
"runtime": {
"host": {
"authentication": {
"provider": "AppService"
}
}
},
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
},
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "editor",
"actions": ["create", "read", "update", "delete"]
}
]
},
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": [
{
"action": "read",
"policy": {
"database": "@claims.oid eq @item.customerId"
}
}
]
}
]
}
}
}