您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

Azure 应用服务中的身份验证和授权的高级用法

本文介绍了如何自定义应用服务中的内置身份验证和授权,以及如何从应用程序管理标识。

若要快速入门,请参阅以下教程之一:

使用多个登录提供程序

门户配置不会向用户全面提供多个登录提供程序(例如 Facebook 和 Twitter)。 但是,将此功能添加到应用并不困难。 步骤概括如下:

首先,在 Azure 门户中的“身份验证/授权”页上,配置想要启用的每个标识提供者。

在“请求未经身份验证时需执行的操作”中,选择“允许匿名请求(无操作)”。

在登录页、导航栏或应用的其他任何位置中,将一个登录链接添加到已启用的每个提供程序 (/.auth/login/<provider>)。 例如:

<a href="/.auth/login/aad">Log in with Azure AD</a>
<a href="/.auth/login/microsoftaccount">Log in with Microsoft Account</a>
<a href="/.auth/login/facebook">Log in with Facebook</a>
<a href="/.auth/login/google">Log in with Google</a>
<a href="/.auth/login/twitter">Log in with Twitter</a>
<a href="/.auth/login/apple">Log in with Apple</a>

当用户单击其中一个链接时,系统会打开相应的登录页让用户登录。

若要将登录后用户重定向到自定义 URL,请使用 post_login_redirect_url 查询字符串参数(不要与标识提供者配置中的重定向 URI 混淆)。 例如,若要在登录后将用户导航至 /Home/Index,使用以下 HTML 代码:

<a href="/.auth/login/<provider>?post_login_redirect_url=/Home/Index">Log in</a>

验证来自提供程序的令牌

在客户端定向的登录中,应用程序手动将用户登录到提供程序,然后将身份验证令牌提交给应用服务进行验证(请参阅身份验证流)。 此验证本身不实际向你授予对所需应用资源的访问权限,但成功的验证会向你提供一个会话令牌,可以使用该令牌来访问应用资源。

若要验证提供程序令牌,必须首先为应用服务应用配置所需的提供程序。 在运行时,从你的提供程序检索身份验证令牌后,将令牌发布到 /.auth/login/<provider> 进行验证。 例如:

POST https://<appname>.azurewebsites.net/.auth/login/aad HTTP/1.1
Content-Type: application/json

{"id_token":"<token>","access_token":"<token>"}

令牌格式根据提供程序而略有不同。 有关详细信息,请参阅下表:

提供程序值 请求正文中必需的 注释
aad {"access_token":"<access_token>"}
microsoftaccount {"access_token":"<token>"} expires_in 属性为可选。
从 Live 服务请求令牌时,将始终请求 wl.basic 作用域。
google {"id_token":"<id_token>"} authorization_code 属性为可选。 指定它时,还可以选择同时指定 redirect_uri 属性。
facebook {"access_token":"<user_access_token>"} 使用来自 Facebook 的有效用户访问令牌
twitter {"access_token":"<access_token>", "access_token_secret":"<acces_token_secret>"}

如果提供程序令牌成功通过验证,则 API 将在响应正文中返回一个 authenticationToken,这是你的会话令牌。

{
    "authenticationToken": "...",
    "user": {
        "userId": "sid:..."
    }
}

获得此会话令牌后,你可以通过向 HTTP 请求中添加 X-ZUMO-AUTH 标头来访问受保护的应用资源。 例如:

GET https://<appname>.azurewebsites.net/api/products/1
X-ZUMO-AUTH: <authenticationToken_value>

注销会话

用户可通过向应用的 /.auth/logout 终结点发送 GET 请求来启动注销。 GET 请求可执行以下操作:

  • 清除当前会话中的身份验证 Cookie。
  • 从令牌存储中删除当前用户的令牌。
  • 对于 Azure Active Directory 和 Google,请对标识提供程序执行服务器端的注销。

以下是网页中一个简单的注销链接:

<a href="/.auth/logout">Sign out</a>

默认情况下,成功注销后,客户端会重定向到 URL /.auth/logout/done。 通过添加 post_logout_redirect_uri 查询参数可更改注销后的重定向页面。 例如:

GET /.auth/logout?post_logout_redirect_uri=/index.html

建议你对的值 进行编码 post_logout_redirect_uri

使用完全限定的 URL 时,URL 必须托管在同一域中,或配置为允许应用访问的外部重定向 URL。 在以下示例中,若要重定向到未托管在同一域中的 https://myexternalurl.com

GET /.auth/logout?post_logout_redirect_uri=https%3A%2F%2Fmyexternalurl.com

Azure Cloud Shell中运行以下命令:

az webapp auth update --name <app_name> --resource-group <group_name> --allowed-external-redirect-urls "https://myexternalurl.com"

保留 URL 片段

用户登录应用后,通常希望会重定向到同一页面的同一部分,例如 /wiki/Main_Page#SectionZ。 不过,由于 URL 片段 (例如, #SectionZ) 永远不会发送到服务器,因此,在 OAuth 登录完成后,默认情况下不保留它们,并重定向回你的应用程序。 然后,当用户需再次导航到所需定位点时,他们无法获得最佳体验。 此限制存在于所有服务器端身份验证解决方案中。

在应用服务身份验证中,可跨 OAuth 登录保留 URL 片段。 为此,请将名为 WEBSITE_AUTH_PRESERVE_URL_FRAGMENT 的应用设置设为 true。 可在 Azure 门户 中执行此操作,或只需在 Azure Cloud Shell 中运行以下命令:

az webapp config appsettings set --name <app_name> --resource-group <group_name> --settings WEBSITE_AUTH_PRESERVE_URL_FRAGMENT="true"

访问用户声明

应用服务使用特殊的标头将用户声明传递给应用程序。 不允许外部请求设置这些标头,因此,只会提供应用服务设置的标头。 部分标头示例如下:

  • X-MS-CLIENT-PRINCIPAL-NAME
  • X-MS-CLIENT-PRINCIPAL-ID

使用任何语言或框架编写的代码均可从这些标头获取所需信息。 对于 ASP.NET 4.6 应用, ClaimsPrincipal 会自动设置为相应的值。 但是,ASP.NET Core 不提供与应用服务用户声明集成的身份验证中间件。 有关解决方法,请参阅 MaximeRouiller.Azure.AppService.EasyAuth

如果已为你的应用启用 令牌存储 ,你还可以通过调用获取经过身份验证的用户的其他详细信息 /.auth/me 。 移动应用服务器 SDK 提供处理该数据的帮助器方法。 有关详细信息,请参阅如何使用 Azure 移动应用 Node.js SDK使用适用于 Azure 移动应用的 .NET 后端服务器 SDK

检索应用代码中的令牌

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

提供程序 标头名称
Azure Active Directory 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
Microsoft 帐户 X-MS-TOKEN-MICROSOFTACCOUNT-ACCESS-TOKEN
X-MS-TOKEN-MICROSOFTACCOUNT-EXPIRES-ON
X-MS-TOKEN-MICROSOFTACCOUNT-AUTHENTICATION-TOKEN
X-MS-TOKEN-MICROSOFTACCOUNT-REFRESH-TOKEN
Twitter 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 调用。 如果使用移动应用 SDK,可将该参数添加到 LogicAsync 重载之一(请参阅 Google 刷新令牌)。
  • Facebook:不提供刷新令牌。 生存期较长的令牌在 60 天后过期(请参阅 Facebook 访问令牌的过期和延期)。
  • Twitter:访问令牌不会过期(请参阅 Twitter OAuth 常见问题解答)。
  • Microsoft 帐户配置 Microsoft 帐户身份验证设置时,请选择 wl.offline_access 范围。
  • Azure Active Directory:在 https://resources.azure.com 中执行以下步骤:
    1. 在页面顶部,选择“读/写”。

    2. 在左侧浏览器中,导航到 "订阅" > * <subscription_name* > resourceGroups > _ <resource_group_name> >提供商"> > > >。 <app_name> >

    3. 单击 “编辑”

    4. 修改以下属性。 替换 <app_id> 为要访问的服务的 Azure Active Directory 应用程序 ID。

      "additionalLoginParams": ["response_type=code id_token", "resource=<app_id>"]
      
    5. 单击“放置”。

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

若要随时刷新访问令牌,只需以任何语言调用 /.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>

备注

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

限制登录帐户的域

Microsoft 帐户和 Azure Active Directory 都允许从多个域登录。 例如,Microsoft 帐户允许 outlook.comlive.comhotmail.com 帐户。 Azure AD 允许对登录帐户使用任意数量的自定义域。 但是,建议将用户直接转到自己品牌的 Azure AD 登录页面(如 contoso.com)。 若要推荐登录帐户的域名,请执行以下步骤。

在中 https://resources.azure.com ,导航到 "订阅" > * <subscription_name* > resourceGroups > _ <resource_group_name> >提供商"> > > >。 <app_name> >

单击“编辑”,修改以下属性,然后单击“放置”。 请确保将替换为所 <domain_name> 需的域。

"additionalLoginParams": ["domain_hint=<domain_name>"]

此设置将 domain_hint 查询字符串参数追加到登录重定向 URL。

重要

接收重定向 URL 之后,客户端可能删除 domain_hint 参数,然后使用其他域登录。 所以虽然此功能非常方便,但它不是一项安全功能。

授权或拒绝用户

尽管应用服务会处理最简单的授权问题(例如,拒绝未经身份验证的请求),但应用可能需要更精细的授权行为,例如,仅将访问权限限制给特定的一组用户。 在某些情况下,需要编写自定义应用程序代码以允许或拒绝已登录用户的访问。 在其他情况下,应用服务或标识提供者可能无需进行代码更改即可提供帮助。

服务器级别(仅限 Windows 应用)

对于任何 Windows 应用,可以通过编辑 Web.config 文件来定义 IIS Web 服务器的授权行为。 Linux 应用不使用 IIS,无法通过 Web.config 进行配置。

  1. 导航到 https://<app-name>.scm.azurewebsites.net/DebugConsole

  2. 在打开应用服务文件的浏览器资源管理器中,导航到“site/wwwroot”。 如果 Web.config 不存在,请选择“+” > “新建文件”来创建该文件。

  3. 选择“Web.config”旁边的铅笔图标对其进行编辑。 添加以下配置代码,然后单击“保存”。 如果 Web.config 已存在,则只需在其中添加包含任何内容的 <authorization> 元素即可。 在 <allow> 元素中添加要允许的帐户。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
       <system.web>
          <authorization>
            <allow users="user1@contoso.com,user2@contoso.com"/>
            <deny users="*"/>
          </authorization>
       </system.web>
    </configuration>
    

标识提供者级别

标识提供者可能会提供某些密钥授权。 例如:

应用程序级别

如果其他任何级别不提供所需的授权,或者平台或标识提供者不受支持,则必须编写自定义代码,以基于用户声明为用户授权。

更新配置版本(预览版)

对于身份验证/授权功能,管理 API 具有两种版本。 V2 预览版本是 Azure 门户“身份验证(预览版)”体验的必备项。 已在使用 V1 API 的应用可在进行一些更改后升级到 V2 版本。 具体而言,必须将机密配置移至槽粘滞应用程序设置。 目前,V2 中也不支持配置 Microsoft 帐户提供程序。

警告

迁移到 V2 预览版后,将禁止通过某些客户端(例如 Azure 门户、Azure CLI 和 Azure PowerShell 中的现有体验)管理应用程序的应用服务身份验证/授权功能。 此更改无法撤消。 在预览版期间,不建议也不支持迁移生产工作负载。 你只需按照本部分中测试应用程序的步骤操作即可。

将机密移动到应用程序设置

  1. 使用 V1 API 获取现有配置:

    # For Web Apps
    az webapp auth show -g <group_name> -n <site_name>
    
    # For Azure Functions
    az functionapp auth show -g <group_name> -n <site_name>
    

    在生成的 JSON 有效负载中,记下已配置的每个提供程序所用的机密值:

    • AAD:clientSecret
    • Google googleClientSecret
    • Facebook facebookAppSecret
    • Twitter twitterConsumerSecret
    • Microsoft 帐户:microsoftAccountClientSecret

    重要

    机密值是重要的安全凭据,应谨慎处理。 请勿共享这些值或将其保留在本地计算机。

  2. 应为每个机密值创建槽粘滞应用程序设置。 可以选择每个应用程序设置的名称。 其值应与上一步中获取的值匹配,也可能引用使用该值创建的密钥保管库机密

    若要创建此设置,可使用 Azure 门户或对每个提供程序运行以下命令(应进行相应更改):

    # For Web Apps, Google example    
    az webapp config appsettings set -g <group_name> -n <site_name> --slot-settings GOOGLE_PROVIDER_AUTHENTICATION_SECRET=<value_from_previous_step>
    
    # For Azure Functions, Twitter example
    az functionapp config appsettings set -g <group_name> -n <site_name> --slot-settings TWITTER_PROVIDER_AUTHENTICATION_SECRET=<value_from_previous_step>
    

    备注

    此配置的应用程序设置应标记为槽粘滞,这意味着它们不会在槽交换操作期间在各环境之间移动。 这是因为身份验证配置本身与环境相关联。

  3. 创建名为 authsettings.json 的新 JSON 文件。采用之前接收的输出,并删除其中的每个机密值。 将其余的输出写入该文件,确保不包含任何机密。 在某些情况下,配置中可能有包含空字符串的数组。 请确保 microsoftAccountOAuthScopes 不包含这类数组,如有,请将值切换为 null

  4. authsettings.json 添加一个属性,该属性指向之前为每个提供程序创建的应用程序设置名称:

    • AAD:clientSecretSettingName
    • Google googleClientSecretSettingName
    • Facebook facebookAppSecretSettingName
    • Twitter twitterConsumerSecretSettingName
    • Microsoft 帐户:microsoftAccountClientSecretSettingName

    完成这一操作后的示例文件可能类似于以下内容,本例中仅对 AAD 进行了配置:

    {
        "id": "/subscriptions/00d563f8-5b89-4c6a-bcec-c1b9f6d607e0/resourceGroups/myresourcegroup/providers/Microsoft.Web/sites/mywebapp/config/authsettings",
        "name": "authsettings",
        "type": "Microsoft.Web/sites/config",
        "location": "Central US",
        "properties": {
            "enabled": true,
            "runtimeVersion": "~1",
            "unauthenticatedClientAction": "AllowAnonymous",
            "tokenStoreEnabled": true,
            "allowedExternalRedirectUrls": null,
            "defaultProvider": "AzureActiveDirectory",
            "clientId": "3197c8ed-2470-480a-8fae-58c25558ac9b",
            "clientSecret": null,
            "clientSecretSettingName": "MICROSOFT_IDENTITY_AUTHENTICATION_SECRET",
            "clientSecretCertificateThumbprint": null,
            "issuer": "https://sts.windows.net/0b2ef922-672a-4707-9643-9a5726eec524/",
            "allowedAudiences": [
                "https://mywebapp.azurewebsites.net"
            ],
            "additionalLoginParams": null,
            "isAadAutoProvisioned": true,
            "aadClaimsAuthorization": null,
            "googleClientId": null,
            "googleClientSecret": null,
            "googleClientSecretSettingName": null,
            "googleOAuthScopes": null,
            "facebookAppId": null,
            "facebookAppSecret": null,
            "facebookAppSecretSettingName": null,
            "facebookOAuthScopes": null,
            "gitHubClientId": null,
            "gitHubClientSecret": null,
            "gitHubClientSecretSettingName": null,
            "gitHubOAuthScopes": null,
            "twitterConsumerKey": null,
            "twitterConsumerSecret": null,
            "twitterConsumerSecretSettingName": null,
            "microsoftAccountClientId": null,
            "microsoftAccountClientSecret": null,
            "microsoftAccountClientSecretSettingName": null,
            "microsoftAccountOAuthScopes": null,
            "isAuthFromFile": "false"
        }   
    }
    
  5. 提交此文件作为应用的新身份验证/授权配置:

    az rest --method PUT --url "/subscriptions/<subscription_id>/resourceGroups/<group_name>/providers/Microsoft.Web/sites/<site_name>/config/authsettings?api-version=2020-06-01" --body @./authsettings.json
    
  6. 验证应用程序在此操作后是否仍按预期运行。

  7. 删除前面的步骤中使用的文件。

现在,你已迁移应用,以将标识提供者机密存储为应用程序设置。

支持 Microsoft 帐户注册

V2 API 目前不支持将 Microsoft 帐户作为不同的提供程序。 相反,它利用汇聚 Microsoft 标识平台 通过个人 microsoft 帐户登录用户。 切换到 V2 API 时,V1 Azure Active Directory 配置用于配置 Microsoft 标识平台提供程序。

如果现有配置包含 Microsoft 帐户提供程序而不包含 Azure Active Directory 提供程序,则可以将配置切换到 Azure Active Directory 提供程序,然后执行迁移。 要执行此操作:

  1. 转到 Azure 门户中的应用注册,并找到与你的 Microsoft 帐户提供程序关联的注册。 该注册可能位于“来自个人帐户的应用程序”标题下。
  2. 导航到该注册的“身份验证”页。 在“重定向 URI”下,你应会看到以 /.auth/login/microsoftaccount/callback 结尾的条目。 复制此 URI。
  3. 添加一个与刚刚复制的 URI 匹配的新 URI,但要将其结尾改为 /.auth/login/aad/callback。 这样,应用服务身份验证/授权配置便可以使用注册。
  4. 导航到应用的应用服务身份验证/授权配置。
  5. 收集 Microsoft 帐户提供程序的配置。
  6. 使用“高级”管理模式配置 Azure Active Directory 提供程序,同时提供你在上一步中收集的客户端 ID 和客户端密码值。 对于证书颁发者 URL,请使用 <authentication-endpoint>/<tenant-id>/v2.0,然后将 <authentication-endpoint> 替换为云环境的身份验证终结点(例如全球 Azure 的“https://login.microsoftonline.com”),同时将 <tenant-id> 替换为你的 Directory(租户)ID 。
  7. 保存配置后,请在浏览器中导航到站点上的 /.auth/login/aad 终结点,以测试登录流,然后完成登录流。
  8. 至此,你已成功复制配置,但现有 Microsoft 帐户提供程序配置仍然存在。 在将其删除之前,请确保应用程序的所有部分都通过登录链接等引用 Azure Active Directory 提供程序。验证应用的所有部分是否按预期工作。
  9. 验证 AAD Azure Active Directory 提供程序能够正常运作后,即可删除 Microsoft 帐户提供程序配置。

某些应用可能已对 Azure Active Directory 和 Microsoft 帐户拥有单独的注册。 此时不能迁移这些应用。

警告

可通过修改 AAD 应用注册支持的帐户类型来聚合两个注册。 但这样会强制向 Microsoft 帐户用户显示新的同意提示,并且这些用户的标识声明在结构上可能不同,同时由于正在使用新的应用 ID,sub 值会发生明显变化。 除非完全理解此方法,否则不建议使用该方法。 应等待 V2 API 表面提供对两个注册的支持。

切换到 V2

执行上述步骤后,请导航到 Azure 门户中的应用。 选择 "身份验证 (预览) " 部分。

或者,你可以对 config/authsettingsv2 站点资源下的资源发出 PUT 请求。 负载的架构与 " 使用文件配置 " 部分中捕获的相同。

使用文件进行配置(预览)

可以选择通过部署提供的文件来配置身份验证设置。 应用服务身份验证/授权的某些预览功能可能要求此操作。

重要

请记住,应用的有效负载(并由此该文件)可能随在环境之间移动。 可能需要将不同的应用注册固定到每个槽,在这些情况下,应继续使用标准配置方法,而非配置文件。

启用基于文件的配置

注意

预览期间,启用基于文件的配置会禁止通过某些客户端(例如 Azure 门户、Azure CLI 和 Azure PowerShell)管理应用程序的应用服务身份验证/授权功能。

  1. 在项目根目录(部署到 Web/函数应用中的 D:\home\site\wwwroot)为配置创建新的 JSON 文件。 根据基于文件的配置引用填写所需的配置。 如果修改现有 Azure 资源管理器配置,确保将 authsettings 集合中捕获的属性转换为配置文件。

  2. 修改现有配置,它在 Microsoft.Web/sites/<siteName>/config/authsettings 下的 Azure 资源管理器 API 中捕获。 若要进行修改,可以使用 Azure 资源管理器模板Azure 资源浏览器之类的工具。 在 authsettings 集合中,需要设置三个属性(并可能删除其他属性):

    1. enabled 设为 true
    2. isAuthFromFile 设为 true
    3. authFilePath 设为文件的名称(例如 auth.json)

备注

authFilePath 的格式在平台之间有所不同。 在 Windows 上,支持相对路径和绝对路径。 建议使用相对路径。 对于 Linux,当前仅支持绝对路径,因此设置的值应为“/home/site/wwwroot/auth.json”或类似。

完成此配置更新后,该文件的内容将用于定义该站点的应用服务身份验证/授权行为。 如果希望回到 Azure 资源管理器配置,可以将 isAuthFromFile 设置回 false。

配置文件引用

从配置文件引用的任何机密都必须存储为应用程序设置。 可以将设置命名为任何所需名称。 只需确保配置文件中的引用使用相同的键。

以下详尽无遗地介绍文件中的可能配置选项:

{
    "platform": {
        "enabled": <true|false>
    },
    "globalValidation": {
        "unauthenticatedClientAction": "RedirectToLoginPage|AllowAnonymous|Return401|Return403",
        "redirectToProvider": "<default provider alias>",
        "excludedPaths": [
            "/path1",
            "/path2"
        ]
    },
    "httpSettings": {
        "requireHttps": <true|false>,
        "routes": {
            "apiPrefix": "<api prefix>"
        },
        "forwardProxy": {
            "convention": "NoProxy|Standard|Custom",
            "customHostHeaderName": "<host header value>",
            "customProtoHeaderName": "<proto header value>"
        }
    },
    "login": {
        "routes": {
            "logoutEndpoint": "<logout endpoint>"
        },
        "tokenStore": {
            "enabled": <true|false>,
            "tokenRefreshExtensionHours": "<double>",
            "fileSystem": {
                "directory": "<directory to store the tokens in if using a file system token store (default)>"
            },
            "azureBlobStorage": {
                "sasUrlSettingName": "<app setting name containing the sas url for the Azure Blob Storage if opting to use that for a token store>"
            }
        },
        "preserveUrlFragmentsForLogins": <true|false>,
        "allowedExternalRedirectUrls": [
            "https://uri1.azurewebsites.net/",
            "https://uri2.azurewebsites.net/",
            "url_scheme_of_your_app://easyauth.callback"
        ],
        "cookieExpiration": {
            "convention": "FixedTime|IdentityDerived",
            "timeToExpiration": "<timespan>"
        },
        "nonce": {
            "validateNonce": <true|false>,
            "nonceExpirationInterval": "<timespan>"
        }
    },
    "identityProviders": {
        "azureActiveDirectory": {
            "enabled": <true|false>,
            "registration": {
                "openIdIssuer": "<issuer url>",
                "clientId": "<app id>",
                "clientSecretSettingName": "APP_SETTING_CONTAINING_AAD_SECRET",
            },
            "login": {
                "loginParameters": [
                    "paramName1=value1",
                    "paramName2=value2"
                ]
            },
            "validation": {
                "allowedAudiences": [
                    "audience1",
                    "audience2"
                ]
            }
        },
        "facebook": {
            "enabled": <true|false>,
            "registration": {
                "appId": "<app id>",
                "appSecretSettingName": "APP_SETTING_CONTAINING_FACEBOOK_SECRET"
            },
            "graphApiVersion": "v3.3",
            "login": {
                "scopes": [
                    "public_profile",
                    "email"
                ]
            },
        },
        "gitHub": {
            "enabled": <true|false>,
            "registration": {
                "clientId": "<client id>",
                "clientSecretSettingName": "APP_SETTING_CONTAINING_GITHUB_SECRET"
            },
            "login": {
                "scopes": [
                    "profile",
                    "email"
                ]
            }
        },
        "google": {
            "enabled": true,
            "registration": {
                "clientId": "<client id>",
                "clientSecretSettingName": "APP_SETTING_CONTAINING_GOOGLE_SECRET"
            },
            "login": {
                "scopes": [
                    "profile",
                    "email"
                ]
            },
            "validation": {
                "allowedAudiences": [
                    "audience1",
                    "audience2"
                ]
            }
        },
        "twitter": {
            "enabled": <true|false>,
            "registration": {
                "consumerKey": "<consumer key>",
                "consumerSecretSettingName": "APP_SETTING_CONTAINING TWITTER_CONSUMER_SECRET"
            }
        },
        "apple": {
            "enabled": <true|false>,
            "registration": {
                "clientId": "<client id>",
                "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_SECRET"
            },
            "login": {
                "scopes": [
                    "profile",
                    "email"
                ]
            }
        },
        "openIdConnectProviders": {
            "<providerName>": {
                "enabled": <true|false>,
                "registration": {
                    "clientId": "<client id>",
                    "clientCredential": {
                        "clientSecretSettingName": "<name of app setting containing client secret>"
                    },
                    "openIdConnectConfiguration": {
                        "authorizationEndpoint": "<url specifying authorization endpoint>",
                        "tokenEndpoint": "<url specifying token endpoint>",
                        "issuer": "<url specifying issuer>",
                        "certificationUri": "<url specifying jwks endpoint>",
                        "wellKnownOpenIdConfiguration": "<url specifying .well-known/open-id-configuration endpoint - if this property is set, the other properties of this object are ignored, and authorizationEndpoint, tokenEndpoint, issuer, and certificationUri are set to the corresponding values listed at this endpoint>"
                    }
                },
                "login": {
                    "nameClaimType": "<name of claim containing name>",
                    "scopes": [
                        "openid",
                        "profile",
                        "email"
                    ],
                    "loginParameterNames": [
                        "paramName1=value1",
                        "paramName2=value2"
                    ],
                }
            },
            //...
        }
    }
}

将应用固定到特定身份验证运行时版本

启用身份验证/授权时,会将平台中间件注入 HTTP 请求管道,如功能概述中所述。 作为平台例常更新的一部分,此平台中间件定期更新新功能和改进。 默认情况下,Web 或函数应用在此平台中间件的最新版本上运行。 这些自动更新始终向后兼容。 但在极少情况下此自动更新引入 Web 或函数应用的运行时问题,此时可以暂时回滚到以前的中间件版本。 本文介绍如何将应用临时固定到特定版本的身份验证中间件。

自动和手动版本更新

可以通过设置应用的 runtimeVersion 设置,将应用固定到平台中间件的特定版本。 应用始终在最新版本上运行,除非选择将其显式固定回特定版本。 一次支持几个版本。 如果固定到不再受支持的无效版本,应用将改用最新版本。 若要始终运行最新版本,将 runtimeVersion 设为 ~1。

查看和更新当前运行时版本

可以更改应用使用的运行时版本。 新的运行时版本应在重启应用后生效。

查看当前运行时版本

可以使用 Azure CLI 或应用中的内置版本 HTTP 终结点之一来查看平台身份验证中间件的当前版本。

通过 Azure CLI

使用 Azure CLI 通过 az webapp auth show 命令查看当前中间件版本。

az webapp auth show --name <my_app_name> \
--resource-group <my_resource_group>

在此代码中,用应用名称替换 <my_app_name>。 还使用应用的资源组名称替换 <my_resource_group>

将在 CLI 输出中看到 runtimeVersion 字段。 它类似于以下示例输出,为了清晰起见,该输出已被截断:

{
  "additionalLoginParams": null,
  "allowedAudiences": null,
    ...
  "runtimeVersion": "1.3.2",
    ...
}
使用版本终结点

还可点击应用上的 /.auth/version 终结点来查看应用运行所在的当前中间件版本。 它类似于以下示例输出:

{
"version": "1.3.2"
}

更新当前运行时版本

使用 Azure CLI,可以通过 az webapp auth update 命令更新应用中的 runtimeVersion 设置。

az webapp auth update --name <my_app_name> \
--resource-group <my_resource_group> \
--runtime-version <version>

<my_app_name> 替换为你的应用的名称。 还使用应用的资源组名称替换 <my_resource_group>。 另外,将 <version> 替换为 1.x 运行时的有效版本,或替换为 ~1 获取最新版本。 可以在 [此处] (https://github.com/Azure/app-service-announcements) 查找不同运行时版本的发行说明来帮助确定要固定到哪个版本。

可以通过在前面代码示例中选择“试一试”运行这个来自 Azure Cloud Shell 的命令。 还可以在执行 az login 登录后使用 Azure CLI 在本地执行此命令。

后续步骤