我使用Azure B2C创建了一个带有用户帐户Authentican的默认.NET Core 2.0 MVC Web应用程序。我已经能够成功登录我的B2C政策。
我希望获得用户的访问令牌,该令牌将被转发到另一个api。 我跟着this post但是在第二步中返回的access_token是null事件,尽管id_token不是。
我尝试通过添加'令牌'来更改OpenIdConnection的ResponseType选项。得到" id_token代码令牌" (如显示here),我收到错误
邮件包含错误:' invalid_request',error_description: ' AADB2C90055:范围' openid个人资料'必须提供请求 指定资源,例如' https://example.com/calendar.read'。
我只在ResponseType有“令牌”时才会收到错误消息。在它。
如何修复此错误?我是否需要设置资源或更改范围?我是否正确地以正确的方式获取access_token?
更多信息: 我使用Azure创建了一个带有用户帐户身份验证的默认.NET Core应用程序我一直在修改自动生成的AzureAdB2cAuthenticationBuilderExtension.cs。
我修改了配置功能:
public void Configure(string name, OpenIdConnectOptions options)
{
options.ClientId = _azureOptions.ClientId;
options.Authority = $"{_azureOptions.Instance}/{_azureOptions.Domain}/{_azureOptions.SignUpSignInPolicyId}/v2.0";
options.UseTokenLifetime = true;
options.CallbackPath = _azureOptions.CallbackPath;
// Added 'token' here so I can retrieve the access token
options.ResponseType = "code id_token token";
options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" };
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = OnRedirectToIdentityProvider,
OnRemoteFailure = OnRemoteFailure,
//Added this so I can store the access_token in the cache
OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,
};
}
然后我添加了以下函数,以便我可以存储并稍后从TokenCache中检索访问令牌
public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
{
// Use MSAL to swap the code for an access token
// Extract the code from the response notification
var code = context.ProtocolMessage.Code;
string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, context.HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(_azureOptions.ClientId, _azureOptions.Authority, _azureOptions.RedirectUri, new Microsoft.Identity.Client.ClientCredential(_azureOptions.ClientSecret), userTokenCache, null);
try
{
Microsoft.Identity.Client.AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, _azureOptions.ApiScopes.Split(' '));
context.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
catch (Exception ex)
{
//TODO: Handle
throw;
}
}
答案 0 :(得分:1)
你要做的是你要求"令牌" (= access_token),但不要定义你想要的范围"令牌"从。您需要发布API范围,以及为调用应用程序的 Azure B2C 门户中的范围授予权限。
然后,当登录到调用应用程序(通常是UI应用程序)时,您可以请求"令牌" (access_token)在登录时定义您感兴趣的范围。如果您通过范围正确地将调用UI应用程序的权限分配给已发布的API应用程序,您将在&中看到匹配的范围#34; SCP"权利要求。