Azure ad b2c 如何在ASP Core 2.0中获取Azure AD B2C返回的令牌?

Azure ad b2c 如何在ASP Core 2.0中获取Azure AD B2C返回的令牌?,azure-ad-b2c,Azure Ad B2c,我使用Azure B2C创建了一个默认的.NET Core 2.0 MVC Web应用程序,其用户帐户为Authentican。我已经能够使用我的B2C策略成功登录 我希望获得用户的访问令牌,该令牌将转发到另一个api。 我遵循了这一点,但是在第二步中带回的访问令牌是null事件,尽管id\u令牌不是 我试图通过添加“token”来获得“id\u token code token”(如图所示),从而更改OpenIdConnection的ResponseType选项,但出现了一个错误 消息包含错误

我使用Azure B2C创建了一个默认的.NET Core 2.0 MVC Web应用程序,其用户帐户为Authentican。我已经能够使用我的B2C策略成功登录

我希望获得用户的访问令牌,该令牌将转发到另一个api。 我遵循了这一点,但是在第二步中带回的访问令牌是null事件,尽管id\u令牌不是

我试图通过添加“token”来获得“id\u token code token”(如图所示),从而更改OpenIdConnection的ResponseType选项,但出现了一个错误

消息包含错误:“无效请求”,错误描述: 'AADB2C90055:请求中提供的作用域'openid配置文件' 指定资源,例如“”

只有当ResponseType中有“token”时,我才会得到错误

如何修复此错误?我需要设置资源还是更改范围?我是否打算以正确的方式获取访问令牌

更多信息: 我创建了一个默认的.NET核心应用程序,该应用程序具有Azure的用户帐户身份验证。我一直在修改自动生成的AzureAdB2cAuthenticationBuilderExtension.cs

我修改了配置功能:

public void配置(字符串名称、OpenIdConnectOptions选项)
{
options.ClientId=\u azureOptions.ClientId;
options.Authority=$“{u-azureOptions.Instance}/{u-azureOptions.Domain}/{u-azureOptions.signupsignnpolicyid}/v2.0”;
options.UseTokenLifetime=true;
options.CallbackPath=\u azureOptions.CallbackPath;
//在这里添加了“令牌”,以便我可以检索访问令牌
options.ResponseType=“代码id\u令牌”;
options.TokenValidationParameters=新的TokenValidationParameters{NameClaimType=“name”};
options.Events=新的OpenIdConnectEvents
{
OnRedirectToIdentityProvider=OnRedirectToIdentityProvider,
OnRemoteFailure=OnRemoteFailure,
//添加此项,以便我可以将访问令牌存储在缓存中
OnAuthorizationCodeReceived=OnAuthorizationCodeReceived,
};
}
然后,我添加了下面的函数,以便可以存储并稍后从令牌缓存中检索访问令牌

AuthorizationCodeReceived上的公共异步任务(AuthorizationCodeReceivedContext上下文)
{
//使用MSAL将代码交换为访问令牌
//从响应通知中提取代码
var code=context.ProtocolMessage.code;
string signedInUserID=context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache=新的MSALSessionCache(SignedUserId,context.HttpContext).GetMsalCacheInstance();
机密ClientApplication cca=新的机密ClientApplication(_-azureOptions.ClientId、_-azureOptions.Authority、_-azureOptions.RedirectUri,新的Microsoft.Identity.Client.ClientCredential(_-azureOptions.ClientSecret),userTokenCache,null);
尝试
{
Microsoft.Identity.Client.AuthenticationResult=等待cca.AcquireTokenByAuthorizationCodeAsync(代码,_-azureOptions.ApiScopes.Split(“”));
HandleCodeRedemption(result.AccessToken、result.IdToken);
}
捕获(例外情况除外)
{
//TODO:手柄
投掷;
}
}

您所做的是请求“令牌”(=access\u token),但不定义要从中获取“令牌”的范围。您需要为调用应用程序发布API作用域,并在Azure B2C门户中向作用域授予权限


然后,当登录到调用应用程序(通常是UI应用程序)时,您可以在登录时通过定义您感兴趣的范围来请求“令牌”(access_token)。如果通过作用域将调用UI应用程序的权限正确分配给已发布的API应用程序,您将在“scp”声明中看到匹配的作用域。

您的请求中没有传递作用域。你能分享一些你是如何提出请求的吗?你发布的第一个答案应该是正确的。它使用代码授权流将代码交换为令牌。你发布的第二个博客应该是针对AAD的,而不是AAD B2C,它使用隐式流,其响应类型应该是
id\u token token
,不包含
code
。在将令牌添加到缓存的AuthorizationCodeReceived上触发添加“code”。这可能是错误的方法。即使只有一个应用程序注册(例如,本机客户端),也需要这样做。只需添加一个默认范围,然后向应用程序授予此范围的权限-如果需要,不要忘记授予权限(对于管理员类型的同意)。