如何从ASP Core 2.0中的Azure AD B2C返回令牌?

时间:2018-05-04 16:21:00

标签: azure-ad-b2c

我使用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;
    }
}

1 个答案:

答案 0 :(得分:1)

你要做的是你要求"令牌" (= access_token),但不要定义你想要的范围"令牌"从。您需要发布API范围,以及为调用应用程序的 Azure B2C 门户中的范围授予权限。

然后,当登录到调用应用程序(通常是UI应用程序)时,您可以请求"令牌" (access_token)在登录时定义您感兴趣的范围。如果您通过范围正确地将调用UI应用程序的权限分配给已发布的API应用程序,您将在&中看到匹配的范围#34; SCP"权利要求。