数据 API 生成器中的本地身份验证

在本地使用数据 API 生成器开发解决方案或在本地运行数据 API 生成器时,需要通过模拟具有特定角色或声明的请求来测试配置的身份验证和授权选项。

若要模拟未经身份验证的请求而不配置身份验证提供程序(例如Microsoft Entra ID),可以使用 Simulator 身份验证提供程序:

1. 使用 Simulator 提供者

Simulator 是可配置的身份验证提供程序,指示数据 API 生成器引擎将所有请求视为经过身份验证。

  • 至少会在系统角色 Authenticated的上下文中评估所有请求。
  • 如果需要,将在 Http 标头中表示的任何角色的 X-MS-API-ROLE 上下文中评估请求。

注释

虽然符合所需的角色,但由于无法使用 Simulator 提供程序为经过身份验证的用户设置自定义声明,定义数据库策略的授权权限无法正常工作。

更新运行时配置身份验证提供程序

请确保在配置文件中指定了 Simulator 身份验证提供程序和 development 模式。 请参阅此示例 host 配置部分:

"host": {
  "mode": "development",
  "authentication": {
    "provider": "Simulator"
  }
}

指定请求的角色上下文

作为 Simulator 数据 API 生成器的认证提供者,无需自定义标头即可将角色上下文设置为系统角色 Authenticated

curl --request GET \
  --url http://localhost:5000/api/books \

若要将角色上下文设置为任何其他角色(包括系统角色 Anonymous), X-MS-API-ROLE 必须将标头包含在所需的角色中:

curl --request GET \
  --url http://localhost:5000/api/books \
  --header 'X-MS-API-ROLE: author' \

2. 使用 AppService 提供程序

身份验证 AppService 提供程序指示数据 API 生成器仅在 Azure 容器应用环境中运行时查找一组 HTTP 标头。 客户端在本地运行时设置这些 HTTP 标头,以模拟经过身份验证的用户,包括任何角色成员身份或自定义声明。

"host": {
  "mode": "development",
  "authentication": {
    "provider": "AppService"
  }
}

发送包含已生成的 X-MS-CLIENT-PRINCIPAL 标头的请求

数据 API 生成器在本地运行并配置为使用 AppService 身份验证提供程序后,可以使用以下模板手动生成客户端主体对象:

{  
  "identityProvider": "test",
  "userId": "12345",
  "userDetails": "john@contoso.com",
  "userRoles": ["author", "editor"]
}

应用服务具有以下属性:

资产 DESCRIPTION
身份提供程序 任何字符串值。
userId 用户的唯一标识符。
用户详情 用户的用户名或电子邮件地址。
用户角色 用户分配的角色的数组。

若要使用 X-MS-CLIENT-PRINCIPAL 标头传递,JSON 有效负载必须经过 Base64 编码。 可以使用任何联机或脱机工具执行此作。 其中一种工具是 DevToys。 示例 Base64 编码的有效载荷,代表之前提到的 JSON。

eyAgCiAgImlkZW50aXR5UHJvdmlkZXIiOiAidGVzdCIsCiAgInVzZXJJZCI6ICIxMjM0NSIsCiAgInVzZXJEZXRhaWxzIjogImpvaG5AY29udG9zby5jb20iLAogICJ1c2VyUm9sZXMiOiBbImF1dGhvciIsICJlZGl0b3IiXQp9

以下 cURL 请求模拟一个经过身份验证的用户在Book角色上下文中检索可用的author实体记录列表:

curl --request GET \
  --url http://localhost:5000/api/books \
  --header 'X-MS-API-ROLE: author' \
  --header 'X-MS-CLIENT-PRINCIPAL: eyAgCiAgImlkZW50aXR5UHJvdmlkZXIiOiAidGVzdCIsCiAgInVzZXJJZCI6ICIxMjM0NSIsCiAgInVzZXJEZXRhaWxzIjogImpvaG5AY29udG9zby5jb20iLAogICJ1c2VyUm9sZXMiOiBbImF1dGhvciIsICJlZGl0b3IiXQp9'