是否可以向 AzureAdBearer 令牌添加多个受众?

jan*_*oni 5 azure-active-directory asp.net-core azure-ad-msal

我有一个使用 MSAL 从 Azure AD 获取访问令牌的应用程序。这是在客户端完成的,客户端有自己的 Azure 应用程序注册表。然后我将此访问令牌传递给服务器,然后服务器调用 Microsoft Graph 以代表用户获取其他信息。但是,当我进行图形调用时,我遇到了受众不匹配的失败。这似乎很合适,但现在我不确定如何将 Web 服务器受众 ID 添加到令牌中。

首先,对于这种类型的场景,这是正确的工作流程吗?我使用 MSAL 对用户进行身份验证,然后使用 Web 服务调用图形以获取更多信息。其次,如果使用 AzureADBearer,是否可以向访问令牌添加多个受众?我知道 JWTBearer 是可能的。

//web service
services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;

        });

        services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;

        })
        .AddAzureAdBearer(options =>
        {
            Configuration.Bind("AzureAd", options);

        })
        .AddCookie(options => options.Cookie.SameSite = SameSiteMode.None);
Run Code Online (Sandbox Code Playgroud)

Roh*_*gal 3

概念

您描述流程的方式看起来像是您正在使用从客户端到 Web 服务的令牌直接代表用户调用 Microsoft Graph API。这对于流程来说是不正确的。

一旦您根据传入令牌在 Web 服务中对客户端进行了身份验证,那么 Web 服务应该代表用户获取专门用于 Microsoft Graph 的新令牌(使用第一个令牌)。

请参阅此处的流程的更详细说明Azure Active Directory v2.0 和 OAuth 2.0 代表流程

代码示例

看一下这个代码示例。它非常接近您想要实现的目标。

这里,WPF 应用程序首先调用 ASP.NET Core Web API,API 随后代表用户调用 Microsoft Graph。

调用 Microsoft Graph 的 ASP.NET Core 2.1 Web API,本身是使用 Azure AD V2 从 WPF 应用程序调用的

代码中需要注意的重要部分:

查看 TodoListController.cs,其中 API 首先代表用户获取新的 AccessToken,传入所需的范围,然后使用此新令牌来调用 Microsoft Graph API。

 public async Task<string> CallGraphApiOnBehalfOfUser()
 {
    string[] scopes = { "user.read" };

    // we use MSAL.NET to get a token to call the API On Behalf Of the current user
    try
    {
        string accessToken = await _tokenAcquisition.GetAccessTokenOnBehalfOfUser(HttpContext, scopes);
        dynamic me = await CallGraphApiOnBehalfOfUser(accessToken);
        return me.userPrincipalName;
    }
Run Code Online (Sandbox Code Playgroud)