你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
将应用服务或 Azure Functions 应用配置为使用 Azure AD 登录
选择另一个身份验证提供商以跳转到它。
本文介绍如何为 Azure 应用服务或 Azure Functions 配置身份验证,使应用使用 Microsoft 标识平台 (Azure AD) 作为身份验证提供程序为用户登录。
应用服务身份验证功能可以通过 Microsoft 标识平台自动创建应用注册。 你还可以使用你或目录管理员单独创建的注册。
注意
用于创建新注册的选项不适用于政府云。 可以单独定义注册。
选项 1:自动创建新的应用注册
除非需要单独创建应用注册,否则请使用此选项。 它使身份验证的启用变得简单,只需单击几下鼠标即可。 创建应用注册后,可以在 Azure AD 中对它进行自定义。
登录 Azure 门户并导航到你的应用程序。
在左侧菜单中选择“身份验证”。 单击“添加标识提供者”。
在“标识提供者”下拉列表中选择“Microsoft”。 默认会选中用于创建新注册的选项。 你可以更改注册名称或支持的帐户类型。
将创建一个客户端密码,并将其存储为一个名为
MICROSOFT_PROVIDER_AUTHENTICATION_SECRET
的槽粘滞应用程序设置。 如果你想要在 Azure Key Vault 中管理机密,稍后可以将该设置更新为使用 Key Vault 引用。如果这是为应用程序配置的第一个标识提供程序,你还将看到“应用服务身份验证设置”部分的提示。 否则你可转到下一步。
这些选项可确定应用程序如何响应未经身份验证的请求,默认选择会将所有请求重定向到用此新提供程序登录。 你现在可以更改自定义此行为,也可以稍后通过选择“身份验证”设置旁边的“编辑”,在主要“身份验证”屏幕上调整这些设置。 若要详细了解这些选项,请参阅身份验证流。
(可选)单击“下一步:权限”并添加应用程序所需的任何 Microsoft Graph 权限。 这些作用域将被添加到应用注册中,但你也可以稍后更改它们。
单击“添加”。
现在,你可以在应用中使用 Microsoft 标识平台进行身份验证了。 该提供程序将在“身份验证”屏幕上列出。 在该屏幕上,你可以编辑或删除此提供程序配置。
有关为访问 Azure 存储和 Microsoft Graph 的 Web 应用配置 Azure AD 登录的示例,请参阅此教程。
选项 2:使用单独创建的现有注册
可以将应用服务身份验证配置为使用现有应用注册。 以下情况是使用现有应用注册的最常见情况:
- 你的帐户无权在 Azure AD 租户中创建应用注册。
- 你想要使用的应用注册来自其他 Azure AD 租户,而不是你的应用所在的租户。
- 用于创建新注册的选项不适用于政府云。
步骤 1:在 Azure AD 中为你的应用服务应用创建应用注册
在应用注册的创建期间,请收集以下信息,稍后在应用服务应用中配置身份验证时需要用到它们:
- 客户端 ID
- 租户 ID
- 客户端机密(可选)
- 应用程序 ID URI
若要注册应用,请执行以下步骤:
登录到 Azure 门户,搜索并选择“应用服务”,然后选择应用。 记下应用的 URL。 稍后要使用此 URL 来配置 Azure Active Directory 应用注册。
在门户菜单中,选择“Azure Active Directory”。
在左侧导航栏中,选择“应用注册”>“新建注册”。
在“注册应用”页上的“名称”中,输入应用注册的名称。
在“支持的帐户类型”中,选择可以访问此应用程序的帐户类型。
在“重定向 URI”部分中,选择“Web”平台,然后键入
<app-url>/.auth/login/aad/callback
。 例如,https://contoso.azurewebsites.net/.auth/login/aad/callback
。选择“注册”。
在应用注册创建后,复制“应用(客户端) ID”和“目录(租户) ID”,以供稍后使用。
在“隐式授权和混合流”下,启用“ID 令牌”,以允许 OpenID Connect 用户从应用服务登录。 选择“保存”。
(可选)从左侧导航栏中选择“品牌 & 属性”。 在“主页 URL”中,输入应用服务应用的 URL,然后选择“保存”。
在左侧导航栏中,选择“公开 API>集>保存”。 此值在应用程序用作资源时唯一标识该应用程序,从而可以请求令牌以授予访问权限。 它用作所创建作用域的前缀。
对于单租户应用,可以使用默认值,其格式为
api://<application-client-id>
。 还可以根据租户的一个已验证域指定更具可读性的 URI,例如https://contoso.com/api
。 对于多租户应用,必须提供自定义 URI。 要详细了解可接受的应用 ID URI 格式,请参阅应用注册最佳做法参考。选择“添加范围”。
- 在“范围名称”中输入 user_impersonation。
- 如果要允许用户许可此范围的权限,请在“谁可以同意”中选择“管理员和用户”。
- 在文本框中,输入许可范围名称,以及希望在许可页上向用户显示的说明。 例如,输入“访问 <应用程序名>”。
- 选择“添加作用域”。
(可选):要创建客户端密码:
- 在左侧导航栏中,选择“证书 & 机密”>“客户端密码”>“新建客户端密码”。
- 输入说明和过期时间,然后选择“添加”。
- 在“值”字段中,复制客户端密码值。 离开此页面后,它将不会再次显示。
(可选)若要添加多个回复 URL,请选择“身份验证”。
步骤 2:在应用服务应用中启用 Azure Active Directory。
登录 Azure 门户并导航到你的应用程序。
在左侧导航栏中,选择“身份验证”>“添加标识提供者”>“Microsoft”。
对于“应用注册类型”,选择以下选项之一:
选取此目录中的一个现有应用注册:从当前租户中选择一个应用注册,并自动收集必要的应用信息。
提供现有应用注册的详细信息:或者如果你的帐户在当前租户中没有查询注册的权限,则指定来自另一个租户的应用注册的详细信息。 对于此选项,你将需要填写以下配置详细信息:
字段 说明 应用程序(客户端)ID 使用应用注册的应用(客户端)ID。 客户端机密 使用在应用注册中生成的客户端机密。 使用客户端密码,将使用混合流,并且应用服务将返回访问令牌和刷新令牌。 如果未设置客户端密码,则使用隐式流并仅返回 ID 令牌。 这些令牌由提供程序发送并存储在 EasyAuth 令牌存储中。 颁发者 URL 使用 <authentication-endpoint>/<tenant-id>/v2.0
,并将 <authentication-endpoint> 替换为云环境的身份验证终结点(例如,全局 Azure 的“https://login.microsoftonline.com"”),同时将 <tenant-id> 替换为在其中创建应用注册的“目录(租户) ID”。 例如,此值用于将用户重定向到相应的 Azure AD 租户,以及下载适当的元数据,以便确定相应的令牌签名密钥和令牌颁发者声明值。 对于使用 Azure AD v1 的应用程序,请省略 URL 中的/v2.0
。允许的令牌受众 配置的应用程序(客户端)ID 始终被隐式视为允许的受众。 如果它是云应用或服务器应用,并且你想要接受来自客户端应用服务应用标头的身份验证令牌(可以在 X-MS-TOKEN-AAD-ID-TOKEN 中检索身份验证令牌),请在此处添加客户端应用的应用程序(客户端)ID。 该客户端密码将存储为一个名为
MICROSOFT_PROVIDER_AUTHENTICATION_SECRET
的槽粘滞应用程序设置。 如果你想要在 Azure Key Vault 中管理机密,稍后可以将该设置更新为使用 Key Vault 引用。
如果这是为应用程序配置的第一个标识提供程序,你还将看到“应用服务身份验证设置”部分的提示。 否则你可转到下一步。
这些选项可确定应用程序如何响应未经身份验证的请求,默认选择会将所有请求重定向到用此新提供程序登录。 你现在可以更改自定义此行为,也可以稍后通过选择“身份验证”设置旁边的“编辑”,在主要“身份验证”屏幕上调整这些设置。 若要详细了解这些选项,请参阅身份验证流。
单击“添加”。
现在,你可以在应用中使用 Microsoft 标识平台进行身份验证了。 该提供程序将在“身份验证”屏幕上列出。 在该屏幕上,你可以编辑或删除此提供程序配置。
添加自定义授权策略
创建的应用注册会对你的 Azure AD 租户的传入请求进行身份验证。 默认情况下,它让租户中的任何人都可以访问应用程序,这对许多应用程序来说没有问题。 但是,某些应用程序需要通过授权决策来进一步限制访问。 应用程序代码通常是处理自定义授权逻辑的最佳位置。 但是,对于常见方案,Microsoft 标识平台提供了内置检查,可用于限制访问。
本部分介绍如何使用应用服务身份验证 V2 API 启用内置检查。 目前,配置这些内置检查的唯一方法是通过 Azure 资源管理器模板或 REST API。
在 API 对象中,Azure Active Directory 标识提供者配置具有一个 validation
部分,该部分可包含一个 defaultAuthorizationPolicy
对象,如以下结构所示:
{
"validation": {
"defaultAuthorizationPolicy": {
"allowedApplications": [],
"allowedPrincipals": {
"identities": []
}
}
}
}
属性 | 说明 |
---|---|
defaultAuthorizationPolicy |
访问应用必须满足的一组要求。 访问权限基于对其每个已配置属性的逻辑 AND 授予。 同时配置 allowedApplications 和 allowedPrincipals 时,传入请求必须同时满足这两个要求才能被接受。 |
allowedApplications |
字符串应用程序客户端 ID 的允许列表,这些 ID 表示正在调用到应用的客户端资源。 当此属性配置为非空数组时,只有通过列表中指定应用程序获得的令牌才会被接受。 此策略评估传入令牌的 appid 或 azp 声明,该令牌必须是访问令牌。 请查看 Microsoft 标识平台声明参考。 |
allowedPrincipals |
用于确定传入请求表示的主体是否可以访问应用的一组检查。 allowedPrincipals 的达成度基于对其已配置的属性的逻辑 OR 。 |
identities (在 allowedPrincipals 下) |
表示具有访问权限的用户或应用程序的字符串对象 ID 的允许列表。 当此属性配置为非空数组时,如果列表中指定了由请求表示的用户或应用程序,则可以满足 allowedPrincipals 要求。此策略评估传入令牌的 oid 声明。 请查看 Microsoft 标识平台声明参考。 |
这些内置检查失败的请求会得到 HTTP 403 Forbidden
响应。
配置客户端应用以访问应用服务
在上一部分中,你注册了应用服务或 Azure Function 以便对用户进行身份验证。 本部分介绍如何在 Azure AD 中注册本机客户端或守护程序应用,让它们能够代表用户或自行请求访问你的应用服务公开的 API,例如在 n 层体系结构中。 如果你只想要对用户进行身份验证,则不需要完成本部分所述的步骤。
本机客户端应用程序
可以注册本机客户端,以代表已登录用户请求访问应用服务应用的 API。
在门户菜单中,选择“Azure Active Directory”。
在左侧导航栏中,选择“应用注册”>“新建注册”。
在“注册应用”页上的“名称”中,输入应用注册的名称。
在“重定向 URI”中,选择“公共客户端(移动和桌面)”,然后键入 URL“
<app-url>/.auth/login/aad/callback
”。 例如,https://contoso.azurewebsites.net/.auth/login/aad/callback
。选择“注册”。
创建应用注册后,复制“应用程序(客户端) ID”的值。
注意
对于Microsoft Store 应用程序,请改用包 SID 作为 URI。
在左侧导航栏中,选择“API 权限”>“添加权限”>“我的 API”。
选择前面为应用服务应用创建的应用注册。 如果未看到该应用注册,请确保在在 Azure AD 中为应用服务应用创建应用注册部分已添加 user_impersonation 范围。
在“委托的权限”下,依次选择“user_impersonation”和“添加权限”。
现已配置一个可以代表用户请求访问应用服务应用的本机客户端应用程序。
守护程序客户端应用程序(服务到服务的调用)
在 n 层体系结构中,客户端应用程序可以获取令牌来代表客户端应用(并非代表用户)调用应用服务或函数应用。 此方案适用于在没有登录用户的情况下执行任务的非交互式后台程序应用程序。 它使用标准 OAuth 2.0 客户端凭据授权。
- 在门户菜单中,选择“Azure Active Directory”。
- 在左侧导航栏中,选择“应用注册”>“新建注册”。
- 在“注册应用”页上的“名称”中,输入应用注册的名称。
- 对于后台应用程序,不需要“重定向 URI”,因此可将其保留为空。
- 选择“注册”。
- 创建应用注册后,复制“应用程序(客户端) ID”的值。
- 在左侧导航栏中,选择“证书 & 机密”>“客户端密码”>“新建客户端密码”。
- 输入说明和过期时间,然后选择“添加”。
- 在“值”字段中,复制客户端密码值。 离开此页面后,它将不会再次显示。
现在可以通过将 resource
参数设置为目标应用的“应用程序 ID URI”,使用客户端 ID 和客户端机密请求访问令牌。 然后,可以使用标准 OAuth 2.0 授权标头将生成的访问令牌提供给目标应用,应用服务身份验证将像平常一样验证和使用该令牌,以指示调用方(在本例中是应用程序,不是用户)已进行身份验证。
目前,这允许 Azure AD 租户中的任何客户端应用程序请求访问令牌,并向目标应用进行身份验证。 如果还想要强制授权以只允许某些客户端应用程序,则必须执行一些附加配置。
- 在表示要保护的应用服务或 Functions 应用的应用注册清单中定义应用角色。
- 在表示需要获得授权的客户端的应用注册上,选择“API 权限”>“添加权限”>“我的 API”。
- 选择之前创建的应用注册。 如果看不到应用注册,请确保已添加应用角色。
- 在“应用程序权限”下,选择之前创建的应用角色,然后选择“添加权限”。
- 确保单击“授予管理员同意”以授权客户端应用程序请求权限。
- 与前面的方案(添加任何角色之前)类似,现在可以为同一目标
resource
请求访问令牌,而访问令牌将包括一个roles
声明,其中包含授权给客户端应用程序的应用角色。 - 在目标应用服务或 Functions 应用代码中,现在可以验证令牌中是否存在预期的角色(这不是由应用服务身份验证执行的)。 有关详细信息,请参阅访问用户声明。
现已配置可以使用自己的标识访问应用服务应用的后台程序客户端应用程序。
最佳做法
无论使用哪种配置来设置身份验证,以下最佳做法都能使租户和应用程序保持更高的安全性:
- 在 Azure AD 中为每个应用服务应用配置各自的应用注册。
- 为每个应用服务应用提供其自身的权限和许可。
- 避免通过对不同的部署槽使用不同的应用注册,在环境之间共享权限。 测试新代码时,这种做法有助于防止问题影响到生产应用。