Asp.net core 是否可以向AzureAdBearer令牌添加多个观众?

Asp.net core 是否可以向AzureAdBearer令牌添加多个观众?,asp.net-core,azure-active-directory,msal,Asp.net Core,Azure Active Directory,Msal,我有一个应用程序使用MSAL从Azure AD获取访问令牌。这是在客户端完成的,客户端有自己的Azure应用程序注册表。然后,我将此访问令牌传递给服务器,然后服务器调用Microsoft Graph以代表用户获取其他信息。然而,当我进行图形调用时,我得到了一个与失败不匹配的受众。这似乎是合适的,但现在我不确定如何将web服务器访问者id添加到令牌中 首先,对于这种类型的场景,这是正确的工作流吗?我使用MSAL对用户进行身份验证,然后使用web服务调用graph以获取更多信息。 第二,如果使用Az

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

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

//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服务
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
options.checkApprovered=context=>true;
options.MinimumSameSitePolicy=SameSiteMode.None;
});
services.AddAuthentication(sharedOptions=>
{
sharedOptions.DefaultScheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddAzureAdBearer(选项=>
{
绑定(“AzureAd”,选项);
})
.AddCookie(options=>options.Cookie.SameSite=SameSiteMode.None);

概念


从描述流的方式来看,您似乎在使用直接从客户端到webservice的令牌来代表用户调用Microsoft Graph API。。代表流而言,这是不正确的

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

请参见此处对流程的更详细描述

代码示例

看看这个代码示例。这非常接近你想要达到的目标

在这里,WPF应用程序首先调用ASP.NET核心Web API,然后API代表用户调用Microsoft Graph

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

查看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;
    }
public异步任务callgraphhapionbehalfouser()
{
string[]scopes={“user.read”};
//我们使用MSAL.NET获取一个令牌来代表当前用户调用API
尝试
{
string accessToken=await _tokenAcquisition.GetAccessTokenOnBehalfourUser(HttpContext,scopes);
动态me=await CallGraphionBehalfourUser(accessToken);
返回me.userPrincipalName;
}

您描述流程的方式我希望您没有使用来自客户端到web服务的令牌直接代表用户调用Microsoft Graph API。因为这对于流程来说是不正确的。一旦您在web服务中基于传入令牌对客户端进行了身份验证,web服务就应该获得代表用户专门为Microsoft graph创建的新令牌(使用第一个令牌)…请参阅此处的更多说明..Rohit完全正确。令牌仅对一个API(也称为访问群体)有效。因此,您必须获取不同的令牌才能调用MS Graph API。您可以获取令牌以代表用户调用,也可以使用客户端凭据并仅作为应用程序进行调用。如果可能,我更喜欢第一种方法,它使用委派权限并限制用户可以访问的内容。第二种方法使用应用程序n权限(这需要管理员同意。似乎在.net core 2 web app上使用Aurad和使用MSAL的.net core 2 web api执行海外建筑运营管理局没有简单的方法。是否正确?我添加了一个带有链接代码示例的答案,以说明如何执行此操作。示例与您尝试执行的WPF应用非常接近(在您的案例中,不要使用web应用)->web API->MS Graph代表用户调用。由于代表用户调用的重要代码逻辑驻留在web API中,您可能会发现它非常相似。请记住,上述操作仅适用于AAD帐户(工作或学校帐户)不适用于Microsoft个人帐户。在V2.0中,没有直接的方法支持OBO用于Microsoft个人帐户。参考: