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

时间:2019-03-21 13:53:05

标签: asp.net-core azure-active-directory 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);

1 个答案:

答案 0 :(得分:1)

概念

描述流程的方式似乎就像是使用从客户端到Web服务的令牌直接代表用户调用Microsoft Graph API一样。这代表流程是不正确的。

一旦您已经基于传入令牌在Web服务中对客户端进行了身份验证,则应该假定Web服务代表用户(使用第一个令牌)获取一个专门用于Microsoft图形的新令牌。

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