Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Serviço de Aplicativo do Azure fornece autenticação interna (geralmente chamada de "EasyAuth") que manipula a entrada do usuário antes que as solicitações cheguem ao seu aplicativo. O Construtor de API de Dados pode ler as informações de identidade que o Serviço de Aplicativo injeta, habilitando a autenticação sem gerenciar tokens diretamente.
Importante
O AppService provedor confia em cabeçalhos de identidade encaminhados pela EasyAuth. Verifique se os clientes não podem ignorar o EasyAuth e acessar o construtor de API de Dados diretamente.
Aviso
Use o provedor de autenticação AppService somente ao hospedar em Serviço de Aplicativo do Azure ou Azure Functions no Serviço de Aplicativo. Configurar esse provedor em um host Windows puro ou em um ambiente que não seja o App Service causa falhas na inicialização, porque a infraestrutura necessária do EasyAuth não está presente. Para testes locais, simule EasyAuth enviando o X-MS-CLIENT-PRINCIPAL cabeçalho manualmente. Consulte Testar localmente com X-MS-CLIENT-PRINCIPAL.
Fluxo de autenticação
Quando o Construtor de API de Dados é executado por trás do Serviço de Aplicativo do Azure com a autenticação habilitada, o Serviço de Aplicativo manipula o fluxo OAuth e passa informações de identidade por meio de cabeçalhos HTTP:
| Fase | O que acontece |
|---|---|
| Autenticação de usuário | O App Service intercepta solicitações não autenticadas e as redireciona para o provedor de identidade. |
| Injeção de identidade | Após a autenticação, o Serviço de Aplicativo adiciona o X-MS-CLIENT-PRINCIPAL cabeçalho |
| Processamento de DAB | O construtor de API de dados Base64 decodifica o cabeçalho JSON e cria um ClaimsPrincipal da claims matriz |
| Autorização | O DAB usa ClaimsPrincipal.IsInRole() para validar o X-MS-API-ROLE cabeçalho e, em seguida, avalia as permissões e as políticas |
Pré-requisitos
- Uma assinatura de Azure
- Serviço de Aplicativo do Azure ou Azure Functions (na infraestrutura do Serviço de Aplicativo)
- CLI do Construtor de API de Dados instalada (guia de instalação)
- um objeto existente
dab-config.jsoncom pelo menos uma entidade
Referência rápida
| Configurações | Valor |
|---|---|
| Fornecedor | 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 |
| Dá suporte a declarações personalizadas | Sim |
| Teste local | Sim (definir cabeçalhos manualmente) |
Etapa 1: Habilitar a autenticação do Serviço de Aplicativo
Configurar a autenticação no Serviço de Aplicativo do Azure:
No portal do Azure, navegue até o Serviço de Aplicativo.
Selecione Configurações>Autenticação.
Selecione Adicionar provedor de identidade.
Escolha a Microsoft (ou outro provedor com suporte).
Defina as configurações:
- Tipo de registro de aplicativo: Criar novo ou selecionar existente
- Tipos de conta com suporte: escolha com base em seu cenário
- Restringir o acesso: exigir autenticação
Selecione Adicionar.
Dica
A autenticação do Serviço de Aplicativo funciona com vários provedores de identidade, incluindo Microsoft, Google, Facebook, Twitter e OpenID Connect.
Etapa 2: Configurar o construtor de API de Dados
Defina o provedor de autenticação como AppService:
CLI
dab configure \
--runtime.host.authentication.provider AppService
Configuração resultante
{
"runtime": {
"host": {
"authentication": {
"provider": "AppService"
}
}
}
}
Observação
Ao contrário dos provedores EntraID, /, AzureAD ou Custom, AppService não requer jwt.audience nem jwt.issuer configurações. O Serviço de Aplicativo valida o token antes de passar informações de identidade para o DAB.
Etapa 3: Configurar permissões de entidade
Defina permissões para funções. O Data API builder avalia os papéis por meio de ClaimsPrincipal.IsInRole(), que verifica as declarações analisadas no cabeçalho X-MS-CLIENT-PRINCIPAL. Inclua declarações de função na claims matriz com o tipo de declaração de função apropriado.
Configuração de exemplo
# 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"]
}
]
}
}
}
Etapa 4: Testar localmente com X-MS-CLIENT-PRINCIPAL
Você pode testar a autenticação do Serviço de Aplicativo localmente fornecendo manualmente o X-MS-CLIENT-PRINCIPAL cabeçalho. Essa abordagem simula o que o EasyAuth encaminha para seu aplicativo e permite que você teste a função e o comportamento controlado por declarações sem implantar no Azure.
Criar um principal de cliente
O X-MS-CLIENT-PRINCIPAL cabeçalho contém um objeto JSON codificado em Base64. O Construtor de API de Dados 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 principal
Codificar o JSON como Base64. Você 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
Enviar uma solicitação 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 analisa as seguintes propriedades do principal do cliente:
| Propriedade | Tipo | Descrição |
|---|---|---|
auth_typ |
cadeia | O tipo de autenticação (por exemplo, aad). Necessário para que a identidade seja considerada autenticada. |
name_typ |
cadeia | (Opcional) O tipo de declaração utilizado para o nome do usuário |
role_typ |
cadeia | (Opcional) O tipo de declaração usado para funções (padrão para roles) |
claims |
object[] | Matriz de declarações com typ e val propriedades. As funções devem ser incluídas aqui como declarações. |
Importante
As funções são avaliadas por meio do ClaimsPrincipal.IsInRole(), que verifica o claims array de declarações que correspondem a role_typ. Incluir cada função como uma entrada de declaração separada (por exemplo, { "typ": "roles", "val": "editor" }).
Usando declarações em políticas de banco de dados
Com o provedor AppService, você pode usar declarações em políticas de banco de dados. Essa funcionalidade permite a segurança em nível de linha com base na identidade do usuário.
Exemplo: Filtrar por ID de objeto de usuário
Este exemplo usa a oid declaração (identificador de objeto), que o ID do Microsoft Entra inclui em tokens:
{
"entities": {
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": [
{
"action": "read",
"policy": {
"database": "@claims.oid eq @item.customerId"
}
}
]
}
]
}
}
}
Dica
Tipos comuns de declaração da ID do Microsoft Entra incluem oid (ID do objeto), email, name e preferred_username. Use a string de tipo de afirmação exata do seu provedor de identidade.
Referências de declaração disponíveis
As referências de reivindicação usam a string de tipo de reivindicação exata do array claims.
| Referência de reclamação | Descrição |
|---|---|
@claims.<claim-type> |
Qualquer reivindicação da matriz claims, correspondida pela propriedade typ |
Por exemplo, se seu principal incluir { "typ": "email", "val": "alice@contoso.com" }, use @claims.email em sua política. O tipo de declaração deve corresponder exatamente.
Solicitações anônimas
Quando o Serviço de Aplicativo permite solicitações não autenticadas ou ao testar localmente sem o cabeçalho, o middleware de autenticação do API Data Builder configura o cabeçalho X-MS-CLIENT-PRINCIPAL para X-MS-API-ROLE automaticamente. As solicitações são então avaliadas usando a anonymous função:
# No principal header = anonymous role (X-MS-API-ROLE set automatically)
curl -X GET "http://localhost:5000/api/Book"
Para que o acesso anônimo funcione, sua entidade deve ter permissões para a anonymous função:
{
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
}
]
}
Solução de problemas
| Sintoma | Causa possível | Solução |
|---|---|---|
401 Unauthorized (ou redirecionar para fazer login) |
O EasyAuth bloqueou a solicitação antes de chegar ao DAB | Entre por meio do EasyAuth ou envie credenciais válidas; verificar as configurações de Autenticação do Serviço de Aplicativo |
403 Forbidden |
Função não está nas permissões | Adicionar a função às permissões de entidade |
403 Forbidden |
X-MS-API-ROLE não nas funções do usuário |
Verifique se o valor do cabeçalho corresponde a uma declaração de função na matriz da entidade de claims segurança |
| Declarações não disponíveis | Array ausente claims no principal do cliente |
Adicionar declarações ao X-MS-CLIENT-PRINCIPAL JSON |
| Função não reconhecida | Funções que não estão na claims matriz |
Adicione declarações de função com o código role_typ correto (por exemplo, { "typ": "roles", "val": "editor" }) |
| Falha no teste local | Cabeçalho não codificado em Base64 | Codificar o JSON corretamente 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"
}
}
]
}
]
}
}
}