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

用于 Node 的 Azure Functions 客户端库的身份验证事件触发器

用于 Azure Functions 的身份验证事件触发器处理所有后端处理, (例如令牌/json 架构验证) ,用于身份验证事件的传入 Http 请求。 并为开发人员提供一个强类型化、版本控制的对象模型,这意味着开发人员无需事先了解请求和响应 json 有效负载。

此项目框架提供以下功能:

  • 用于保护 API 调用的令牌验证
  • 对象模型、键入和 IDE intellisense
  • API 请求和响应架构的入站和出站验证
  • 版本控制
  • 无需样本代码。

入门

安装 npm 包

npm install @azure/functions-authentication-events 

先决条件

对客户端进行身份验证

当 Azure AD 身份验证事件服务调用自定义扩展时,它将发送包含 AuthorizationBearer {token}标头。 此令牌将表示 服务到服务身份验证 ,其中:

  • 资源”也称为 受众,是注册以表示 API 的应用程序。 这由 aud 令牌中的 声明表示。
  • 客户端”是一个 Microsoft 应用程序,它表示 Azure AD 身份验证事件服务。 appId它的值为 99045fe1-7639-4a75-9d4a-577b6ca3810f。 这由以下项表示:
    • azp如果应用程序accessTokenAcceptedVersion属性设置为 2,则令牌中的声明。
    • appid如果资源应用程序的 属性设置为 1null,则令牌中的accessTokenAcceptedVersion声明。

有三种处理令牌的方法。 可以使用如下所示 的应用程序设置 或通过 本地环境中的 local.settings.json 文件自定义行为。

使用 azure AD 身份验证集成Azure Functions验证令牌

在生产环境中运行函数时,强烈建议使用 Azure Functions Azure AD 身份验证集成来验证传入令牌。

  1. 转到函数应用中的“身份验证”选项卡
  2. 单击“添加标识提供者”
  3. 选择“Microsoft”作为标识提供者
  4. 选择“提供现有应用注册的详细信息”
  5. Application ID输入在 Azure AD 中表示 API 的应用的

颁发者和允许的受众取决于 accessTokenAcceptedVersion 应用程序的属性, (可以在应用程序) 的“清单”中找到。

如果 属性 accessTokenAcceptedVersion 设置为 2:6.设置 Issuer URL to "https://login.microsoftonline.com/{tenantId}/v2.0" 7. Set an 'Allowed Audience' to the Application ID (appId 的)

accessTokenAcceptedVersion如果属性设置为 1null:6。Issuer URL to "https://sts.windows.net/{tenantId}/" 7. Set an 'Allowed Audience' to the Application ID URI (also known as如果使用自定义域名,请将 identifierUri). It should be in the format ofapi://{azureFunctionAppName}.azurewebsites.net/{resourceApiAppId}orapi://{FunctionAppFullyQualifiedDomainName}/{resourceApiAppId}”。

默认情况下,身份验证事件触发器将验证是否已配置 Azure 函数身份验证集成,并将检查令牌中的客户端设置为99045fe1-7639-4a75-9d4a-577b6ca3810f通过azp令牌) 中的 或 appid 声明 (。

如果要针对不是 Azure AD 身份验证事件服务的其他客户端(例如使用 Postman)测试 API,可以配置 可选 应用程序设置:

  • AuthenticationEvents__CustomCallerAppId - 所需客户端的 guid。 如果未提供, 99045fe1-7639-4a75-9d4a-577b6ca3810f 则假定为 。

让触发器验证令牌

在本地环境或 Azure 函数服务中未托管的环境中,触发器可以执行令牌验证。 设置以下应用程序设置:

  • AuthenticationEvents__TenantId - 租户 ID
  • AuthenticationEvents__AudienceAppId - 与选项 1 中的“允许受众”相同的值。
  • AuthenticationEvents__CustomCallerAppId (可选) - 所需客户端的 guid。 如果未提供, 99045fe1-7639-4a75-9d4a-577b6ca3810f 则假定为 。

示例 local.settings.json 文件:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "AuthenticationEvents__TenantId": "8615397b-****-****-****-********06c8",
    "AuthenticationEvents__AudienceAppId": "api://46f98993-****-****-****-********0038",
    "AuthenticationEvents__CustomCallerAppId": "46f98993-****-****-****-********0038"
  }
}

无令牌验证

如果想要在本地开发过程中 对令牌进行身份验证,请设置以下应用程序设置:

  • AuthenticationEvents__BypassTokenValidation - 的值true将使触发器不检查令牌验证。

快速入门

  • Visual Studio Code
    • 启动 Visual Studio Code
    • 通过命令 func init . --worker-runtime node 面板运行终端命令
    • 通过命令 func new 面板运行终端命令
    • 按照项目创建提示操作
    • 通过命令 npm install @azure/functions-authentication-events 面板运行终端命令
    • 通过命令 npm install 面板运行终端命令
    • 通过命令 npm run-script build 面板运行终端命令
  • 出于开发目的,请轮到用于测试的令牌验证:
  • AuthenticationEvents__BypassTokenValidation 应用程序密钥添加到 local.settings.json 文件中的“值”部分,并将其值设置为 true。 如果本地环境中没有 local.settings.json 文件,请在 Function App 的根目录中创建一个。
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AuthenticationEvents__BypassTokenValidation": true
  }
}
  • 加载项目后,可以运行示例代码,应会看到 Azure Functions 开发人员的应用程序加载终结点。

关键概念

在此处找到 Azure .NET SDK 的关键概念

文档

  • 其中一个函数已发布,可在此处找到有关日志记录和指标的一些良好阅读

  • 有关 API 文档,请参阅 (链接 TBD)

  • 一旦进入预览版,我们除了没有中断性变更之外,只需删除指向个人预览版的 nuget 源即可。

示例

若要测试令牌扩充,请执行以下操作。

  • 打开在上一步中创建的项目。 (快速入门)
  • 运行应用程序。 func host start
  • Azure Functions 开发人员的应用程序启动后,复制应用程序启动时显示的侦听 URL。
  • 注意:列出了所有身份验证函数,如果注册了一个名为“OnTokenIssuanceStart”的函数侦听器
  • 然后,函数终结点将是侦听 URL 和函数的组合,例如:“http://localhost:7071/runtime/webhooks/AuthenticationEvents?code=(YOUR_CODE)&function=OnTokenIssuanceStart”
  • 使用 Postman 或 Fiddler 等内容发布以下有效负载。
  • 可以在链接 TBD) (找到 Postman 使用步骤
{
    "type": "microsoft.graph.authenticationEvent.tokenIssuanceStart",
    "source": "/tenants/00000001-0000-0ff1-ce00-000000000000/applications/ef9e995c-efdb-4e76-97a9-8cdfc6e06afc",
    "data": {
        "@odata.type": "microsoft.graph.onTokenIssuanceStartCalloutData",
        "tenantId": "00000001-0000-0ff1-ce00-000000000000",
        "authenticationEventListenerId": "f2390d57-9664-4dde-b625-f0115925e1e2",
        "customAuthenticationExtensionId": "9cc1c1ed-5f04-4fdf-85c0-94a7c6ea819c",
        "authenticationContext": {
            "correlationId": "f4bd1870-b774-4fa5-ba78-e08ac6be14c0",
            "client": {
                "ip": "127.0.0.1",
                "locale": "en-us",
                "market": "en-us"
            },
            "protocol": "OAUTH2.0",
            "clientServicePrincipal": {
                "id": "eedfddb9-304e-4d62-aa83-24700a0bcf0e",
                "appId": "ef9e995c-efdb-4e76-97a9-8cdfc6e06afc",
                "appDisplayName": "",
                "displayName": "Test application"
            },
            "resourceServicePrincipal": {
                "id": "eedfddb9-304e-4d62-aa83-24700a0bcf0e",
                "appId": "ef9e995c-efdb-4e76-97a9-8cdfc6e06afc",
                "appDisplayName": "",
                "displayName": "Test application"
            },
            "user": {
                "companyName": "Evo Sts Test",
                "country": "",
                "id": "69d24544-c420-4721-a4bf-106f2378d9f6",
                "mail": "testadmin@evostsoneboxtest.com",
                "onPremisesSamAccountName": "testadmin",
                "onPremisesSecurityIdentifier": "testadmin",
                "preferredDataLocation": "",
                "userPrincipalName": "testadmin@evostsoneboxtest.com"
            }
        }
    }
}
  • 应会看到以下响应:
{
    "data": {
        "@odata.type": "microsoft.graph.onTokenIssuanceStartResponseData",
        "actions": [
            {
                "@odata.type": "ProvideClaimsForToken",
                "claims": [
                    {
                        "DateOfBirth": "01/01/2000"
                    },
                    {
                        "CustomRoles": [
                            "Writer",
                            "Editor"
                        ]
                    }
                ]
            }
        ]
    }
}

疑难解答

  • Visual Studio Code
    • 如果在 Visual Studio Code 中运行,则本地 Azure 存储模拟器不可用时收到错误,可以手动启动模拟器。! (注意:Azure 存储模拟器现已弃用,建议替换 Azurite)
    • 如果在 Mac 上使用 Visual Studio Code,请使用 Azurite
    • 如果在 Windows (出现以下错误,则尝试运行创建的投影时) bug。
    • 此问题可以通过在 powershell Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine 中执行此命令来解决,有关详细信息,可在此处此处找到

后续步骤

有关 Azure SDK 的详细信息,请参阅 此网站

发布

  • 按照此处的说明创建和发布Azure 应用程序。 </azure/azure-functions/functions-develop-vs?tabs=in-process#publish-to-azure>
  • 若要确定已发布的发布终结点,组合创建的 Azure 函数终结点,路由到侦听器和侦听器代码,可以通过导航到 azure 函数应用程序,选择“应用密钥”并复制AuthenticationEvents_extension的值来找到侦听代码。
  • 例如:“https://azureautheventstriggerdemo.azurewebsites.net/runtime/webhooks/AuthenticationEvents?code=(AuthenticationEvents_extension_key)&function=OnTokenIssuanceStart”
  • 确保生产环境具有用于令牌身份验证的正确应用程序设置。
  • 再次可以通过将上述有效负载发布到新终结点来测试已发布的函数。

贡献

有关参与此存储库的详细信息,请参阅 参与指南

本项目欢迎贡献和建议。 大多数贡献要求你同意贡献者许可协议 (CLA),并声明你有权(并且确实有权)授予我们使用你的贡献的权利。 有关详细信息,请访问 https://cla.microsoft.com

提交拉取请求时,CLA 机器人将自动确定你是否需要提供 CLA,并相应地修饰 PR(例如标签、注释)。 直接按机器人提供的说明操作。 只需使用 CLA 在所有存储库中执行此操作一次。

此项目采用了 Microsoft 开放源代码行为准则。 有关详细信息,请参阅行为准则常见问题解答,或如果有任何其他问题或意见,请与 联系。