我正在尝试使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。那会重要吗?如果是这样,为什么不填写呢?

最佳答案

假设您要参考以下教程:


Active Directory B2C Tutorials Web App
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)非空
.LoadUserTokenCacheFromMemory()非空
.GetMsalAccountID()非空
TaskWebApp.Utils.ClaimPrincipalExtension.GetB2CMsalAccountId(System.Security.Claims.ClaimsPrincipal)为空!


具体来说,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/

10-12 04:37