azure-active-directory - 如何为非交互式/守护程序应用程序获取 Azure B2C 持有者令牌并在 Azure HTTP 触发的函数中对其进行验证
问题描述
有一个 C# 应用程序正在开发中,它应该是一个更大的后端应用程序的一部分来处理一些数据。此应用程序应该从 Azure AD B2C 获取令牌并将其发送到 HTTP 触发的函数,在该函数中应该通过以下代码对其进行验证:
var configManager = new ConfigurationManager<OpenIdConnectConfiguration>(
$"{_authenticationSettings.Authority}/.well-known/openid-configuration",
new OpenIdConnectConfigurationRetriever());
var config = await configManager.GetConfigurationAsync();
_validationParameters = new TokenValidationParameters
{
IssuerSigningKeys = config.SigningKeys,
ValidateAudience = true,
// Audience MUST be the app ID aka clientId
ValidAudience = _authenticationSettings.ClientId,
ValidateIssuer = true,
ValidIssuer = config.Issuer,
ValidateLifetime = true
};
var tokenHandler = new JwtSecurityTokenHandler();
var result = tokenHandler.ValidateToken(authHeader.Parameter, _validationParameters, out var jwtToken);
首先,我们认为使用 MSAL 从 Microsoft Graph API 获取访问令牌会有所帮助,但上面的 C# 代码抛出了一个无效的签名异常,我们发现由于这篇 GitHub 帖子是有意义的。显然,我们需要id_token
在应用程序中获取一个 instead 并将其发送到 HTTP 触发的函数以通过上面的代码片段进行验证。
应用程序无法获取,id_token
因为它不应该启动 Azure AD B2C 的登录 UI 以让用户登录并通过 URL 将其重定向。这个问题的解决方案是什么,以便应用程序在没有 UI 的情况下获取令牌并将其发送到 http 触发的函数进行验证?
解决方案
可以通过两种方式为没有 UI 的 AAD B2C 租户获取令牌,您可能应该根据您想要实现的目标选择一种:
- 用户令牌 - 通过使用资源所有者密码凭据流程 - https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-ropc-policy。尽管此流程已被弃用,但通常在遗留应用程序上下文中提及
- 服务器端应用程序令牌 - 通过使用客户端凭据流 - 另一方面,这需要使用特定于 AAD 但具有 AAD B2C 租户的请求 - https://docs.microsoft.com/en-us/azure/active-directory-b2c /application-types#daemonsserver-side-applications
我也不太确定你为什么要使用 id_token 。如果应用程序需要使用令牌授权对函数的请求,那么无论如何检索令牌(交互 UI 与否),它都应该是一个访问令牌。
推荐阅读
- keras - Keras 自定义损失函数与 Lambda 层
- php - 如何使用 php 发送单个 XMPP 消息
- forms - 如何在 Microsoft Access 中创建/更新具有复杂表关系的表单中的记录集
- powershell - 如何防止 Powershell 脚本读取意外输入
- javascript - Undefined Index: id 每当尝试从 id 中选择
- python - 为什么 python 的 `datetime.strptime` 函数在使用 `functools.partial` 调用时的行为方式不同?
- unity3d - 导入统一后体素字符中的纹理损坏
- android - 无法实例化活动 ComponentInfo java.lang.ClassCastException
- azure - ARM 部署错误 - 需要建议如何解决它
- java - Java Spring TaskExecutor 在调用 taskExecutor.execute() 方法后没有立即启动