gpt4 book ai didi

azure - IConfidentialClientApplication GetAccountsAsync 不返回任何内容

转载 作者:行者123 更新时间:2023-12-02 22:04:14 24 4
gpt4 key购买 nike

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

首先它进入 OnAuthorizationCodeReceived, token 和声明看起来是正确的。 AcquireTokenByAuthorizationCode 返回一个 token ,注释说它应该被缓存。然后它进入 TaskController 函数 (Index),并创建另一个 ConfidentialClientApplication。然后它调用 GetAccountsAsync 并返回一个空列表。没有错误,我不知道为什么。这会导致下一行失败,并显示合理的错误消息:“没有帐户或登录提示传递到 AcquireTokenSilent 调用。”因为它传递一个空列表作为第二个参数。

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

// 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. Active Directory B2C Tutorials Web App
  2. Active Directory B2C Tutorials Web Api

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

我也遇到了同样的问题。 TaskWebApp 工作正常,但访问依赖于 TaskWebApi 的任务 View 会导致身份验证循环。这是我的发现以及如何使其发挥作用。

<小时/>

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,我检查了调用堆栈的每个部分以查看返回 null 的位置。

  • GetAccountsAsync()
  • {外部代码}
  • TaskWebApp.Utils.MSALPerUserMemoryTokenCache .UserTokenCacheBeforeAccessNotification(TokenClassNotification) NOT NULL
  • .LoadUserTokenCacheFromMemory() NOT NULL
  • .GetMsalAccountID() NOT NULL
  • 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”中未在任何地方提供的值。

关于azure - IConfidentialClientApplication GetAccountsAsync 不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com