浏览应用服务中的身份验证和授权

已完成

Azure 应用服务提供内置的身份验证和授权支持。 在 Web 应用、RESTful API、移动后端或 Azure Functions 中,只需编写最少量代码或无需不编写代码即可登录用户和访问数据。

为何使用内置身份验证?

无需使用应用服务进行身份验证和授权。 许多 Web 框架绑定了安全功能,你可以根据需要使用不同的功能。 如果所需的灵活性超出了应用服务能够提供的范畴,还可以编写自己的实用工具。

适用于应用服务和 Azure Functions 的内置身份验证功能通过联合标识提供者提供现成的身份验证,可为你节省时间和精力,使你能够专注于应用程序的其余部分。

  • 借助 Azure 应用服务,可以将各种身份验证功能集成到 Web 应用或 API 中,而无需你自行实现。
  • 身份验证直接内置于平台中,无需使用任何特定语言、SDK、安全专业知识或代码。
  • 可与多个登录提供商集成。 例如,Microsoft Entra ID、Facebook、Google、X。

标识提供者

应用服务使用联合标识,在其中,第三方标识提供者会为你管理用户标识和身份验证流。 默认提供以下五个标识提供者:

提供程序 登录终结点 操作说明指南
Microsoft 标识平台 /.auth/login/aad 应用服务 Microsoft 标识平台登录
Facebook /.auth/login/facebook 应用服务 Facebook 登录
Google /.auth/login/google 应用服务 Google 登录
X /.auth/login/twitter 应用服务 X 登录
任何 OpenID Connect 提供程序 /.auth/login/<providerName> 应用服务 OpenID Connect 登录
GitHub /.auth/login/github 应用服务 GitHub 登录

对其中一个提供程序启用身份验证和授权时,其登录终结点可用于用户身份验证,以及验证来自提供程序的身份验证令牌。 你可以轻松为用户提供任意数量的登录选项。

工作原理

身份验证和授权模块在应用程序代码所在的同一沙盒中运行。 启用后,每个传入的 HTTP 请求都要经过它,然后再传递到应用程序代码。 此模块为应用处理多项操作:

  • 使用指定的标识提供者对用户和客户端进行身份验证
  • 验证、存储和刷新由已配置的标识提供程序颁发的 OAuth 令牌
  • 管理经过身份验证的会话
  • 将标识信息插入 HTTP 请求标头

该模块独立于应用程序代码运行,并且可以使用 Azure 资源管理器设置或使用配置文件进行配置。 不需要任何 SDK、特定编程语言,或者对应用程序代码进行更改。

注意

在 Linux 和容器中,身份验证和授权模块在独立于应用程序代码的单独容器中运行。 因为它不是在进程内运行,所以不可能直接与特定的语言框架集成。

身份验证流

身份验证流对于所有提供程序是相同的,但根据是否要使用提供程序的 SDK 登录而有所差别。

  • 不使用提供程序 SDK:应用程序向应用服务委托联合登录。 此类委派通常适用于浏览器应用程序,它可以向用户显示提供者的登录页面。 服务器代码管理登录过程时,被称为服务器定向流或服务器流。

  • 使用提供程序 SDK:应用程序手动将用户登录到提供程序,然后将身份验证令牌提交给应用服务进行验证。 无浏览器应用通常采用此方案,这可以防止向用户显示提供程序的登录页。 应用程序代码管理登录过程时,被称为“客户端导向流”或“客户端流”。 这适用于 REST API、Azure Functions、JavaScript 浏览器客户端,以及使用提供商 SDK 登录用户的本机移动应用。

下表说明了身份验证流的步骤。

步骤 不使用提供程序 SDK 使用提供程序 SDK
将用户登录 将客户端重定向到 /.auth/login/<provider> 客户端代码直接使用提供程序的 SDK 将用户登录,并接收身份验证令牌。 有关详细信息,请参阅提供程序文档。
身份验证后 提供程序将客户端重定向到 /.auth/login/<provider>/callback 客户端代码将来自提供程序的令牌发布到 /.auth/login/<provider> 进行验证。
建立经过身份验证的会话 应用服务将经过身份验证的 Cookie 添加到响应中。 应用服务将自身的身份验证令牌返回给客户端代码。
提供经过身份验证的内容 客户端在后续请求中包含身份验证 Cookie(由浏览器自动处理)。 客户端代码在 X-ZUMO-AUTH 标头中提供身份验证令牌(由移动应用客户端 SDK 自动处理)。

对于客户端浏览器,应用服务可自动将所有未经身份验证的用户定向到 /.auth/login/<provider>。 还可以向用户提供一个或多个 /.auth/login/<provider> 链接,让他们使用所选的提供程序登录到你的应用。

授权行为

在 Azure 门户中,当传入请求未经过身份验证时,可以使用多种行为配置应用服务。

  • 允许未经身份验证的请求:此选项会将对未经身份验证的流量授权推迟到由应用程序代码执行。 对于经过身份验证的请求,应用服务还会在 HTTP 标头中一起传递身份验证信息。 使用此选项可以更灵活地处理匿名请求。 通过它,你可向用户提供多个登录提供程序。

  • 需要身份验证:此选项将拒绝任何未经身份验证的应用程序流量。 这个拒绝可以是指向已配置的标识提供者的重定向操作。 在这些情况下,浏览器客户端将重定向到所选提供商的 /.auth/login/<provider>。 如果匿名请求来自本机移动应用,则返回的响应为 HTTP 401 Unauthorized。 你还可针对所有请求将拒绝配置为 HTTP 401 UnauthorizedHTTP 403 Forbidden

    注意

    以这种方式限制访问适用于对应用的所有调用,对于想要主页公开可用的应用程序来说,这可能是不可取的,就像在许多单页应用程序中一样。

令牌存储

应用服务提供内置的令牌存储,这是与 Web 应用、API 或本机移动应用的用户相关联的令牌存储库。 对任何提供程序启用身份验证时,此令牌存储可立即供应用使用。

日志记录和跟踪

如果启用应用程序日志记录,则会在日志文件中直接收集身份验证和授权跟踪。 如果出现意外的身份验证错误,查看现有的应用程序日志即可方便找到所有详细信息。