你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 应用服务身份验证中使用 OAuth 标记

本文介绍如何在使用应用服务中的内置身份验证和授权时使用 OAuth 标记。

检索应用代码中的令牌

在服务器代码中,提供程序特定的令牌将注入到请求标头中,使你可以轻松访问这些令牌。 下表显示了可能的令牌标头名称:

提供程序 标头名称
Microsoft Entra X-MS-TOKEN-AAD-ID-TOKEN
X-MS-TOKEN-AAD-ACCESS-TOKEN
X-MS-TOKEN-AAD-EXPIRES-ON
X-MS-TOKEN-AAD-REFRESH-TOKEN
Facebook 令牌 X-MS-TOKEN-FACEBOOK-ACCESS-TOKEN
X-MS-TOKEN-FACEBOOK-EXPIRES-ON
Google X-MS-TOKEN-GOOGLE-ID-TOKEN
X-MS-TOKEN-GOOGLE-ACCESS-TOKEN
X-MS-TOKEN-GOOGLE-EXPIRES-ON
X-MS-TOKEN-GOOGLE-REFRESH-TOKEN
X X-MS-TOKEN-TWITTER-ACCESS-TOKEN
X-MS-TOKEN-TWITTER-ACCESS-TOKEN-SECRET

注意

不同的语言框架可能会以不同格式(例如小写或标题字首大写)向应用代码显示这些标头。

在客户端代码(例如移动应用或浏览器中 JavaScript)中,将 HTTP GET 请求发送到 /.auth/me(必须启用令牌存储)。 返回的 JSON 包含提供程序特定的令牌。

注意

访问令牌用于访问提供程序资源,因此,仅当使用客户端机密配置了提供程序时,才提供这些令牌。 若要了解如何获取刷新令牌,请参阅“刷新访问令牌”。

刷新身份验证令牌

当提供程序的访问令牌(而不是会话令牌)到期时,需要在再次使用该令牌之前重新验证用户。 向应用程序的 /.auth/refresh 终结点发出 GET 调用可以避免令牌过期。 调用应用服务时,应用服务会自动刷新已经过身份验证用户的令牌存储中的访问令牌。 应用代码发出的后续令牌请求将获取刷新的令牌。 但是,若要正常刷新令牌,令牌存储必须包含提供程序的刷新令牌。 每个提供程序会阐述获取刷新令牌的方式。以下列表提供了简短摘要:

  • Google:将一个 access_type=offline 查询字符串参数追加到 /.auth/login/google API 调用。 有关详细信息,请参阅 Google 刷新令牌

  • Facebook:不提供刷新令牌。 生存期较长的令牌在 60 天后过期(请参阅 Facebook 访问令牌的过期和延期)。

  • X:访问令牌不会过期(请参阅 OAuth 常见问题解答)。

  • Microsoft:在 https://resources.azure.com 中,执行以下步骤:

    1. 在页面顶部,选择“读/写”。

    2. 在左侧浏览器中,导航到“subscriptions><subscription_name>>resourceGroups><resource_group_name>>providers>Microsoft.Web>sites><app_name>>config>authsettingsV2”。

    3. 单击 “编辑”

    4. 修改以下属性。

      "identityProviders": {
        "azureActiveDirectory": {
          "login": {
            "loginParameters": ["scope=openid profile email offline_access"]
          }
        }
      }
      
    5. 单击“放置”。

    注意

    提供刷新令牌的范围为 offline_access。 请在教程:在 Azure 应用服务中对用户进行端到端身份验证和授权中了解它的使用方法。 应用服务默认已请求其他范围。 有关这些默认范围的信息,请参阅 OpenID Connect 范围

配置提供程序以后,即可在令牌存储中找到访问令牌的刷新令牌和过期时间

若要随时刷新访问令牌,只需以任何语言调用 /.auth/refresh。 以下代码片段从 JavaScript 客户端使用 jQuery 刷新访问令牌。

function refreshTokens() {
  let refreshUrl = "/.auth/refresh";
  $.ajax(refreshUrl) .done(function() {
    console.log("Token refresh completed successfully.");
  }) .fail(function() {
    console.log("Token refresh failed. See application logs for details.");
  });
}

如果用户撤销了授予应用的权限,对 /.auth/me 的调用可能会失败并返回 403 Forbidden 响应。 若要诊断错误,请查看应用程序日志了解详细信息。

延长会话令牌过期宽限期

经过身份验证的会话会在 8 小时后过期。 经过身份验证的会话过期后,默认会提供 72 小时的宽限期。 在此宽限期内,可以使用应用服务刷新会话令牌,而无需重新对用户进行身份验证。 会话令牌失效后,只需调用 /.auth/refresh,而不需要自行跟踪令牌过期时间。 72 小时的宽限期过后,用户必须重新登录才能获取有效的会话令牌。

如果 72 小时的时间不够,可以延长此过期期限。 大大延长过期时间可能会造成严重的安全风险(例如身份验证令牌泄密或被盗)。 因此,应将宽限期保留为默认 72 小时,或者将延期设为最小值。

若要延长默认的过期期限,请在 Cloud Shell 中运行以下命令。

az webapp auth update --resource-group <group_name> --name <app_name> --token-refresh-extension-hours <hours>

注意

宽限期仅适用于应用服务的已经身份验证的会话,而不适用于来自标识提供者的令牌。 已过期的提供程序令牌没有宽限期。

后续步骤