首页 > 解决方案 > 如何为非交互式/守护程序应用程序获取 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 触发的函数进行验证?

标签: azure-active-directoryjwtazure-ad-b2cmsal

解决方案


可以通过两种方式为没有 UI 的 AAD B2C 租户获取令牌,您可能应该根据您想要实现的目标选择一种:

  1. 用户令牌 - 通过使用资源所有者密码凭据流程 - https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-ropc-policy。尽管此流程已被弃用,但通常在遗留应用程序上下文中提及
  2. 服务器端应用程序令牌 - 通过使用客户端凭据流 - 另一方面,这需要使用特定于 AAD 但具有 AAD B2C 租户的请求 - https://docs.microsoft.com/en-us/azure/active-directory-b2c /application-types#daemonsserver-side-applications

我也不太确定你为什么要使用 id_token 。如果应用程序需要使用令牌授权对函数的请求,那么无论如何检索令牌(交互 UI 与否),它都应该是一个访问令牌。


推荐阅读