IConfidentialClientApplication GetAccountsAsync不返回任何内容

时间:2019-07-11 15:51:39

标签: azure azure-ad-b2c

我正在尝试使Azure AD B2C演示与Azure AD一起使用。这有两个项目-TaskService和TaskWebApp。我得到了Web App的一部分。它将我定向到正确的登录页面。我使用的是b2clogin.com,而不是login.microsoftonline.com。如果我转到Web应用程序中的“索赔”页面,一切似乎都正常。但是,当我尝试使用TaskService(任务列表)时,它在TaskController中失败。

首先,它进入OnAuthorizationCodeReceived,并且令牌和声明看起来正确。 AcquireTokenByAuthorizationCode返回一个令牌,并且注释说应该将其缓存。然后进入TaskController函数(索引),并创建另一个ConfidentialClientApplication。然后,它将调用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。那会重要吗?如果是这样,为什么不填写呢?

1 个答案:

答案 0 :(得分:1)

假设您要参考以下教程:

  1. Active Directory B2C Tutorials Web App
  2. Active Directory B2C Tutorials Web Api

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

我有同样的问题。 TaskWebApp可以正常运行,但是访问依赖TaskWebApi的Tasks视图会导致auth循环。这是我发现的内容,以及如何使其工作。


TL; DR

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

<add key="ida:TenantId" value="[your AAD B2C Tenant GUID here]" />

保存,构建和运行。您应该通过此身份验证循环。


详细信息

在Visual Studio中,我在TasksController.cs第29行上设置了一个断点:

var accounts = await cca.GetAccountsAsync();

每当我导航到/ Tasks时,我都可以验证是否找到了此LOC。进入每个被调用的LOC之后,我检查了调用堆栈的每个部分,以查看返回空值的位置。

  • GetAccountsAsync()
  • {外部代码}
  • TaskWebApp.Utils.MSALPerUserMemoryTokenCache .UserTokenCacheBeforeAccessNotification(TokenClassNotification)NOT NULL
  • .LoadUserTokenCacheFromMemory()非空
  • .GetMsalAccountID()非空
  • TaskWebApp.Utils.ClaimPrincipalExtension.GetB2CMsalAccountId(System.Security.Claims.ClaimsPrincipal) NULL!

具体来说,TaskWebApp \ Utils \ ClaimsPrincipalExtension.cs中的第40行返回null。

string tenantId = Globals.TenantId;

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