C# MsalServiceException:AADSTS90014:必填字段';澳元';不见了

C# MsalServiceException:AADSTS90014:必填字段';澳元';不见了,c#,azure,asp.net-core,azure-active-directory,msal,C#,Azure,Asp.net Core,Azure Active Directory,Msal,我正在尝试通过ASP.NET Core 2.2后端应用程序(另一个MVC应用程序)访问Azure REST api。我想基于登录的Azure AD用户获取REST api的OnBehalof身份验证。我犯了一个奇怪的错误 MsalServiceException:AADSTS90014:必填字段“aud”为 失踪 在文档或博客帖子中,我找不到解决方案,甚至找不到讨论的更微妙的问题。下面提到的是我的代码 公共类令牌获取服务:ITokenAcquisitionService { 私有只读用户断言_

我正在尝试通过ASP.NET Core 2.2后端应用程序(另一个MVC应用程序)访问Azure REST api。我想基于登录的Azure AD用户获取REST api的OnBehalof身份验证。我犯了一个奇怪的错误

MsalServiceException:AADSTS90014:必填字段“aud”为 失踪

在文档或博客帖子中,我找不到解决方案,甚至找不到讨论的更微妙的问题。下面提到的是我的代码


公共类令牌获取服务:ITokenAcquisitionService
{
私有只读用户断言_UserAssertion;
私人只读机密客户端应用程序_机密客户端pp;
公共令牌获取服务(UserContextInfo UserContextInfo、MemoryTokenCache、MemoryTokenCache、IConfiguration配置)
{
var tokenCache=memoryTokenCache.GetIDistributedCacheCacheInstance();
var clientId=configuration.GetValue(“AzureAd:clientId”);
var clientSecret=newclientcredential(configuration.GetValue(“AzureAd:clientSecret”);
_机密ClientApp=新的机密ClientApplication(clientId、userContextInfo.BaseRequestUrl、clientSecret、tokenCache、null);
_userAssertion=newuserassertion(userContextInfo.Token);
}
公共异步任务AcquireTokenAsync()
{
字符串[]作用域={”https://example.com/846fsd66-xxxx-yyyy-82cb-1fe40a30f00c/user_impersonation" };
var accounts=wait _secretentialclientapp.GetAccountsAsync();
验证结果;
if(accounts.Any())
结果=wait _secretentialClientApp.AcquireTokenSilentAsync(scopes,accounts.First());
其他的
结果=wait _secretentialClientApp.AcquireTokenOnBehalfOfAsync(作用域,_用户断言);
返回result.AccessToken;
}
}
我使用NuGet软件包Microsoft.Identity.Client 2.7.1版进行REST API身份验证,使用Microsoft.AspNetCore.authentication.AzureAD.UI进行MVC应用程序身份验证

更新

对于MVC应用程序,我使用Azure Active directory身份验证,如下所示(据我所知,它使用自己的cookie身份验证)


错误描述:
AADSTS90014 MissingRequiredField-当凭证中不存在预期字段时,在各种情况下可能会出现此错误代码。

来源:

字段
aud
用于令牌的预期受众。您需要它来验证令牌是针对您要将其发送到的后端的

摘自:

已注册的权利要求-这些是一组预定义的权利要求,不是强制性的,但建议使用,以提供一组有用的、可互操作的权利要求。其中一些是:iss(发行人)、exp(到期时间)、sub(主题)、aud(观众)和其他

摘自:

“aud”(受众)声明标识JWT所针对的接收者。打算处理JWT的每个委托人必须在受众声明中确定自己的价值。如果处理索赔的委托人在该索赔存在时未在“aud”索赔中使用价值进行标识,则必须拒绝JWT。在一般情况下,“aud”值是一个区分大小写的字符串数组,每个字符串都包含一个StringOrURI值。在JWT只有一个受众的特殊情况下,“aud”值可以是包含StringOrURI值的单个区分大小写的字符串。受众价值观的解释通常是特定于应用的。此声明的使用是可选的

在ASP.NET后端配置Azure Active Directory身份验证时,请指定访问群体。在我们的例子中,代码如下所示:

services.AddAuthentication(o =>
{
    o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.Authority = Authority;
    options.Audience = ClientId;
    options.TokenValidationParameters = new TokenValidationParameters
    {
        SaveSigninToken = true
    };
});
其中,
Authority
是包含
AAD实例的属性
+我们的
TenantID
ClientID
是Azure Active Directory中应用程序的
ClientID

将MSAL配置为针对经过身份验证的后端进行对话时,如下所示:

MsalModule.forRoot({
  authority: 'https://login.microsoftonline.com/<TENANT>.onmicrosoft.com',
  clientID: '<CLIENT_ID_GUID>',
  protectedResourceMap: protectedResourceMap
})
MsalModule.forRoot({
当局:'https://login.microsoftonline.com/.onmicrosoft.com',
客户端ID:“”,
protectedResourceMap:protectedResourceMap
})

其中
protectedResourceMap
包含API URL和所需范围的映射。

好吧,我没有对mvc应用程序使用Jwt身份验证。只需Azure active directory身份验证。修改了问题以反映这一点。Hi@rickvdbosch希望您发现更新有帮助。提前谢谢。
MsalModule.forRoot({
  authority: 'https://login.microsoftonline.com/<TENANT>.onmicrosoft.com',
  clientID: '<CLIENT_ID_GUID>',
  protectedResourceMap: protectedResourceMap
})