Azure active directory 多个web API的作用域

Azure active directory 多个web API的作用域,azure-active-directory,azure-ad-b2c,Azure Active Directory,Azure Ad B2c,我的b2c上有2个web API(A和B)。它们中的每一个分别发布自己的权限(scopeA1、scopeA2)和(scopeB1、scopeB2) 在我的web应用程序(已配置并已授予API和4个作用域的访问权限)上,为了在身份验证期间获得这两个API的授权码,我尝试将OpenIDConnectAuthenticationOptions范围属性设置为包括4个作用域。 我收到一个错误AADB2C90146:请求中提供的作用域'scopeA1 scopeA2 scopeB1 scopeB2 open

我的b2c上有2个web API(A和B)。它们中的每一个分别发布自己的权限(scopeA1、scopeA2)和(scopeB1、scopeB2)

在我的web应用程序(已配置并已授予API和4个作用域的访问权限)上,为了在身份验证期间获得这两个API的授权码,我尝试将OpenIDConnectAuthenticationOptions范围属性设置为包括4个作用域。 我收到一个错误AADB2C90146:请求中提供的作用域'scopeA1 scopeA2 scopeB1 scopeB2 openid offline_access'为访问令牌指定了多个资源,这是不受支持的

而如果我只为web api A或B指定作用域,那么它将按照

我如何让我的web应用程序使用这两个web API,即使对这两个API都授予了权限


感谢您的帮助

如果这两个web API在Azure AD中是独立的应用程序,那么您需要分别为它们请求访问令牌

我不熟悉您作为起点使用的示例,但看起来这些行是您需要进行更改的地方:

//使用提供的作用域检索令牌
机密客户端应用程序app=新的机密客户端应用程序(authority,Startup.ClientId,
Startup.RedirectUri,凭证,
新的NaiveSessionCache(userObjectID,this.HttpContext));
AuthenticationResult=等待app.AcquireTokenSilentAsync(范围);
accessToken=result.Token;

您应该为每个API创建一个
app
实例,并为每个API获取一个令牌。然后,当您在其他地方调用API时,请在承载身份验证头中使用正确的访问令牌。

我遇到了同样的问题,并提出了类似的问题

但我还没有找到答案,基本上是为了在短期内解决这个问题,我让我的API使用相同的授权客户机ID+密码,因此我可以在我的API中重复使用相同的作用域

这并不是我想要的,但是如果你想使用Azure广告B2C,你需要在获得支持之前习惯一段时间的妥协

--我还想说,您使用的是我也在使用的MSAL的旧版本,我会等到版本1发布后再升级

github讨论了如何使用这种格式


谢谢。是的,他们在广告上是不同的资源。我将如何在OWIN管道中这样做,因为我只在用户登录后收到授权码?我不确定我的问题是否清楚。目的是了解在用户登录期间,当登录策略起作用时,如何获取授权代码。这就是我想在不同API上要求不同作用域的地方。但是OpenIdConnectAuthenticationOptions的scope属性不能在该点上使用所有不同的作用域(我在上面解释了问题AADB2C90146)。
Step 1: Add MSAL to your Solution/Project
Right click on your project > Manage packages.
Select include prerelease > search msal.
Select the Microsoft.Identity.Client package > install.

Step 2: Instantiate MSAL and Acquire a Token
Create a new PublicClientApplication instance. Make sure to fill in your 
app/client id
PublicClientApplication myApp = new PublicClientApplication(CLIENT_ID);
Acquire a token
AuthenticationResult authenticationResult = await 
myApp.AcquireTokenAsync(SCOPES).ConfigureAwait(false);

Step 3: Use the token!
The access token can now be used in an HTTP Bearer request.