你当前正在访问 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 函数工具
- Azure Function Core Tools
- 如果使用 Visual Studio Code以下扩展:
对客户端进行身份验证
当 Azure AD 身份验证事件服务调用自定义扩展时,它将发送包含 Authorization
的 Bearer {token}
标头。 此令牌将表示 服务到服务身份验证 ,其中:
- “资源”也称为 受众,是注册以表示 API 的应用程序。 这由
aud
令牌中的 声明表示。 - “客户端”是一个 Microsoft 应用程序,它表示 Azure AD 身份验证事件服务。
appId
它的值为99045fe1-7639-4a75-9d4a-577b6ca3810f
。 这由以下项表示:azp
如果应用程序accessTokenAcceptedVersion
属性设置为2
,则令牌中的声明。appid
如果资源应用程序的 属性设置为1
或null
,则令牌中的accessTokenAcceptedVersion
声明。
有三种处理令牌的方法。 可以使用如下所示 的应用程序设置 或通过 本地环境中的 local.settings.json 文件自定义行为。
使用 azure AD 身份验证集成Azure Functions验证令牌
在生产环境中运行函数时,强烈建议使用 Azure Functions Azure AD 身份验证集成来验证传入令牌。
- 转到函数应用中的“身份验证”选项卡
- 单击“添加标识提供者”
- 选择“Microsoft”作为标识提供者
- 选择“提供现有应用注册的详细信息”
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
如果属性设置为 1
或 null
: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 of
api://{azureFunctionAppName}.azurewebsites.net/{resourceApiAppId}or
api://{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
后续步骤
有关 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 开放源代码行为准则。 有关详细信息,请参阅行为准则常见问题解答,或如果有任何其他问题或意见,请与 联系。