首页 > 解决方案 > MSAL TokenAcquisition GetAccessTokenOnBehalfOfUser 始终失败,因为 getaccounts 始终为空

问题描述

我一直在尝试使用 AzureAD MSAL 和 ADAL,但从未能够检索到令牌。我已经尝试了所有示例并继续遇到相同的问题,创建了令牌,将其添加到 EF Cahce DB,但是当 tokenAquisition 对象尝试检索它时,找不到帐户并且无法获取令牌。

我已经阅读了 GitHub 和 SO 上的大部分(如果不是全部)问题。这似乎对其他人有用,但看起来很多人都有同样的问题,除了将我指向我尝试过的样本之外,我还没有看到答案。

目前的简单问题 - 我如何从IConfidentialClientApplication?

我从来没有得到一个帐户或帐户列表。

创建应用对象:

var app = ConfidentialClientApplicationBuilder.CreateWithApplicationOptions(_applicationOptions)
               .WithRedirectUri(currentUri)
               .WithAuthority(authority)
               .Build();

GetAccessTokenOnBehalfOfUser

--> IAccount account = await application.GetAccountAsync(accountIdentifier);

返回 NULL

--> var accounts = await application.GetAccountsAsync(); 

返回一个空列表/ienumarables

我希望从中检索一个帐户application.GetAccountAsync(accountIdentifier) 和一个列表await application.GetAccountsAsync();

标签: .net-coreazure-active-directoryopenid-connectbearer-tokenmsal

解决方案


好的,终于找到我的问题了。

问题在于使用 ASPNet 身份登录到 AzureAD 作为外部授权,但使用身份登录和创建声明原则。

我正在从我的声明中删除 AzureAD ObjectIdentifier。所以解决方案似乎是将 ObjectIdentifier 添加到身份中。我通过使用 ClaimsTransofrmation 并查找身份验证类型来做到这一点。如果它不是 Identity.Application 它来自 AzureAD 并检查用户是否有 UserClaim,如果没有则添加它。然后提取该索赔并将其放入本金的索赔中并隐藏起来,现在该帐户已找到....

        if (principal.HasClaim(c => c.Type == SecurityConstants.ClaimTypes.ObjectId))
        {
            string oId = principal.FindFirstValue(SecurityConstants.ScpcClaimTypes.ObjectId);

            var user = _usrMgr.FindByNameAsync(usrNm).Result;

            List<Claim> claims = new List<Claim>(_usrMgr.GetClaimsAsync(user).Result);
            if (!claims.Exists(c => c.Type == SecurityConstants.ScpcClaimTypes.ObjectId))
            {
                _usrMgr.AddClaimAsync(user, new Claim(SecurityConstants.ScpcClaimTypes.ObjectId, oId));
            }

推荐阅读