Azure IConfidentialClientApplication GetAccountsAsync不返回任何内容

Azure IConfidentialClientApplication GetAccountsAsync不返回任何内容,azure,azure-ad-b2c,Azure,Azure Ad B2c,我正在尝试让Azure广告B2C演示与我的Azure广告一起工作。这有两个项目-TaskService和TaskWebApp。我让Web应用程序部分开始工作。它指引我进入正确的登录页面。我使用的是b2clogin.com而不是login.microsoftonline.com。如果我进入web应用程序中的索赔页面,一切都会正常。但是,当我尝试使用TaskService(待办事项列表)时,它在TaskController中失败 首先,它进入OnAuthorizationCodeReceived,令

我正在尝试让Azure广告B2C演示与我的Azure广告一起工作。这有两个项目-TaskService和TaskWebApp。我让Web应用程序部分开始工作。它指引我进入正确的登录页面。我使用的是b2clogin.com而不是login.microsoftonline.com。如果我进入web应用程序中的索赔页面,一切都会正常。但是,当我尝试使用TaskService(待办事项列表)时,它在TaskController中失败

首先,它进入OnAuthorizationCodeReceived,令牌和声明看起来是正确的。AcquireTokenByAuthorizationCode返回一个令牌,注释表示应该缓存该令牌。然后它进入TaskController函数(索引),并创建另一个机密ClientApplication。然后调用GetAccountsAsync,返回一个空列表。没有错误,我也不知道为什么。这会导致下一行失败,并出现合理的错误消息: “未向AcquireTokenSilent调用传递任何帐户或登录提示。” 因为它正在传递一个空列表作为第二个参数

这导致浏览器在登录页面和web应用程序之间循环多次,直到它决定停止

// Retrieve the token with the specified scopes
var scope = new string[] { Globals.ReadTasksScope };

IConfidentialClientApplication cca = MsalAppBuilder.BuildConfidentialClientApplication();
var accounts = await cca.GetAccountsAsync(); //this returns empty
AuthenticationResult result = await cca.AcquireTokenSilent(scope, accounts.FirstOrDefault()).ExecuteAsync(); //this throws exception
我不确定当我有当前的ClaimsPrincipal时,什么会导致我没有帐户。

编辑:我注意到在OnAuthorizationCodeReceived中,我的AuthenticationResult几乎填写了所有内容,但Account.Username没有填写。那有关系吗?如果是这样,为什么不填写呢?

假设您正在参考以下教程:

  • 和相关的(主分支,提交bf3bcce)

    我也有同样的问题。TaskWebApp工作正常,但访问依赖TaskWebApi的Tasks视图会导致auth循环。以下是我的发现,以及如何让它发挥作用


    TL;DR

    在TaskWebApp项目的Web.config中,在configuration/appSettings中添加以下行:

    <add key="ida:TenantId" value="[your AAD B2C Tenant GUID here]" />
    
    无论何时导航到/Tasks,我都可以验证是否命中此LOC。随后,我进入调用的每个LOC,查看调用堆栈的每个部分,以查看返回null的位置

    • GetAccountsAsync()
    • {外部代码}
    • TaskWebApp.Utils.MSALPerUserMemoryTokenCache.UserTokenCacheBeforeAccessNotification(TokenClassNotification)不为NULL
    • .LoadUserTokenCacheFromMemory()不为NULL
    • .GetMsalAccountID()不为空
    • TaskWebApp.Utils.claimpincipalextension.GetB2CMsalAccountId(System.Security.Claims.ClaimsPrincipal)NULL
    具体而言,TaskWebApp\Utils\ClaimsPrincipalExtension.cs中的第40行返回null

    string tenantId = Globals.TenantId;
    

    它正在从TaskWebApp Web.config中定义的Globals类中分配租户ID,但它使用的是键“ida:TenantId”中的值,该值在任何地方都没有提供。

    您尝试使用哪个b2c演示来处理Azure广告?AAD B2C和AAD非常不同,这不仅仅是简单地更改租户ID和客户端ID。@FrankHuMSFT即使我们正在更改web配置文件中的所有应用程序设置,我们也会从令牌响应错误中获得用户名:Missing
    string tenantId = Globals.TenantId;