Asp.net mvc 从Web应用程序调用两个不同的Azure AD保护API

Asp.net mvc 从Web应用程序调用两个不同的Azure AD保护API,asp.net-mvc,azure-active-directory,microsoft-graph-api,adal,Asp.net Mvc,Azure Active Directory,Microsoft Graph Api,Adal,设置: ASP.NET MVC5应用程序(完整框架NET 4.7),顶部为Azure AD 顶部带有Azure广告的WebAPI(完整框架NET4.7) 两个应用程序中都使用了.NET ADAL 3.x库(非MSAL) 在Katana的Web应用程序中,OWIN中间件: 我验证用户(我控制的目录中的组织帐户) 然后,我交换访问令牌的授权码(使用资源ID:https://graph.microsoft.com) 我将生成的访问令牌放入用户声明中 现在一切都很好,我可以使用访问令牌作为载体,

设置:

  • ASP.NET MVC5应用程序(完整框架NET 4.7),顶部为Azure AD
  • 顶部带有Azure广告的WebAPI(完整框架NET4.7)
  • 两个应用程序中都使用了.NET ADAL 3.x库(非MSAL)
在Katana的Web应用程序中,OWIN中间件:

  • 我验证用户(我控制的目录中的组织帐户)
  • 然后,我交换访问令牌的授权码
    (使用资源ID:https://graph.microsoft.com
  • 我将生成的访问令牌放入用户声明中
现在一切都很好,我可以使用访问令牌作为载体,调用Microsoft Graph,获取用户配置文件、图片等等

但是如何从我的Web应用程序调用我自己的Azure广告保护API?

我不能将授权代码再次交换为不同的resourceId。我可以使用
app\u id
app\u secret
context.AcquireTokenAsync()
,但是我得到的JWT不包含任何用户身份声明,所以现在我的API不知道关于调用用户的任何信息,它只知道机密客户端(我的Web应用程序)确实提供了有效的令牌

我如何请求一个令牌,它将成功调用我的API,并返回某种用户声明?用户主体名称或用户id可能就足够了


我是否应该将所有Microsoft Graph调用逻辑移到WebAPI,并为我的API的resourceId交换授权代码,还是有一个现成的解决方案来解决这个难题?这里的正确模式是什么?好吧,不对,也许更好。

您可以为另一个API请求第二个具有相同授权代码的访问令牌

根据您请求访问令牌的方式,令牌的访问群体可能是API的客户端id或应用程序id URI。因此,您必须确保这两个都是API中可接受的受众

对于ASP.NET核心API,您可以在JWT承载身份验证配置中添加以下内容:

TokenValidationParameters = new TokenValidationParameters
{
    ValidAudiences = new [] { "https://blabla", "g-u-i-d" }
}

为什么不能再次交换身份验证码?你有错误吗?这是OAuth2吗?我的意思是这是一个有效的流吗?我确实尝试过从ADAL获得空异常,但我可以回到绘图板,如果这是可能的,我可以再试一次。好吧,应该是。。ADAL的NRE听起来很奇怪,您必须在API中将它们都配置为有效的访问群体。检查一下,没错。将这两个访问群体添加到
TokenValidationParameters={}
as
validudiences=new[]{”https://blabla“,“g-u-i-d”}
它就像一场梦。如果你愿意发布一个答案,我会把它标记为接受。谢谢你抽出时间。