如何为 non-interactive/daemon 应用程序获取 Azure B2C 持有者令牌并在 Azure HTTP 触发函数中对其进行验证
How to obtain an Azure B2C bearer token for a non-interactive/daemon application and get it validated in an Azure HTTP-triggered function
有一个正在开发的 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# 代码抛出了一个无效的签名异常,我们发现由于 this GitHub post,这是有意义的。显然,我们需要在应用程序中获取一个 id_token
,并将其发送到 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。尽管此流程已弃用,但通常在遗留应用程序上下文中提及
- 服务器端应用程序令牌 - 通过使用客户端 Cretendial 流 - 另一方面,这需要使用特定于 AAD 但具有 AAD B2C 租户的请求 - https://docs.microsoft.com/en-us/azure/active-directory-b2c/application-types#daemonsserver-side-applications
我也不太清楚为什么要使用 id_token。如果应用程序需要使用令牌授权对功能的请求,那么它应该是一个访问令牌,无论令牌是如何检索的(交互式 UI 或不)。
有一个正在开发的 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# 代码抛出了一个无效的签名异常,我们发现由于 this GitHub post,这是有意义的。显然,我们需要在应用程序中获取一个 id_token
,并将其发送到 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。尽管此流程已弃用,但通常在遗留应用程序上下文中提及
- 服务器端应用程序令牌 - 通过使用客户端 Cretendial 流 - 另一方面,这需要使用特定于 AAD 但具有 AAD B2C 租户的请求 - https://docs.microsoft.com/en-us/azure/active-directory-b2c/application-types#daemonsserver-side-applications
我也不太清楚为什么要使用 id_token。如果应用程序需要使用令牌授权对功能的请求,那么它应该是一个访问令牌,无论令牌是如何检索的(交互式 UI 或不)。