【问题标题】:Is it possible to add multiple audiences to AzureAdBearer token?是否可以向 AzureAdBearer 令牌添加多个受众?
【发布时间】:2019-08-12 09:37:29
【问题描述】:

我有一个使用 MSAL 从 Azure AD 获取访问令牌的应用。这是在拥有自己的 Azure App Registry 的客户端上完成的。然后,我将此访问令牌传递给服务器,然后服务器调用 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);

【问题讨论】:

  • 您描述流程的方式我希望您没有直接使用从客户端到 Web 服务的令牌来代表用户调用 Microsoft Graph API。因为这在代表流程..一旦您根据传入令牌在 Web 服务中对客户端进行了身份验证,那么 Web 服务应该代表用户获取专门用于 Microsoft 图形的新令牌(使用第一个令牌).. 查看更多描述这里..docs.microsoft.com/en-us/azure/active-directory/develop/…
  • Rohit 完全正确。令牌仅对一个 API(又名受众)有效。因此,您必须获取不同的令牌才能调用 MS Graph API。您可以获取令牌以代表用户调用,也可以使用客户端凭据并仅作为应用程序进行调用。如果可能,我更喜欢第一种方法,它使用委派的权限并将您限制在用户可以访问的范围内。第二种方法使用应用程序权限(需要管理员同意。
  • 看起来没有简单的方法可以在 .net core 2 web 应用程序上使用 AureAD 和使用 MSAL 的 .net core 2 web api 执行 OBO。是这样吗?
  • 我添加了一个带有链接代码示例的答案,以展示如何做到这一点。示例非常接近您尝试执行的 WPF 应用程序(而不是您的情况下的 Web 应用程序) -> Web API -> 代表用户的 MS Graph。由于代表用户调用的重要代码逻辑驻留在 Web API 中,您可能会发现它非常相似。

标签: asp.net-core azure-active-directory msal


【解决方案1】:

概念

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

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

在此处查看更多详细的流程描述Azure Active Directory v2.0 and OAuth 2.0 On-Behalf-Of flow

代码示例

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

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

ASP.NET Core 2.1 Web API calling Microsoft Graph, itself called from a WPF application using Azure AD V2

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

查看 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;
    }

【讨论】:

  • 请记住,以上内容仅适用于 AAD 帐户(工作或学校帐户),不适用于 Microsoft 个人帐户。在 V2.0 中,没有直接的方法来支持 Microsoft 个人帐户的 OBO。参考:stackoverflow.com/questions/55290906/…
猜你喜欢
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2011-06-15
  • 2015-11-07
  • 2018-11-15
  • 1970-01-01
相关资源
最近更新 更多