具有ADAL.Net的获取令牌会为托管的AD帐户引发未知的用户类型

时间:2018-11-04 12:12:09

标签: azure-active-directory adal

我正在尝试使用OAuth2令牌来调用Web(api)服务,该令牌基于使用ADAL.Net登录到AAD加入的计算机上的AAD受管用户帐户-特别是使用此示例: https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/AcquireTokenSilentAsync-using-Integrated-authentication-on-Windows-(Kerberos)

但是我不断收到异常消息:未知的用户类型

在我的设置中,我已使用同步的AAD用户帐户登录到AAD专用网络内的计算机。然后,我使用WindowsAuthentication运行示例代码。

经过一些调试后,我可以缩小要在ADAL.Net中从此方法引发的异常

protected internal /* internal for test only */ override async Task PreTokenRequestAsync()
    {
        await base.PreTokenRequestAsync().ConfigureAwait(false);

        if (!SupportADFS)
        {
            var userRealmResponse = await _commonNonInteractiveHandler.QueryUserRealmDataAsync(Authenticator.UserRealmUriPrefix)
               .ConfigureAwait(false);

            if (string.Equals(userRealmResponse.AccountType, "federated", StringComparison.OrdinalIgnoreCase))
            {
                WsTrustResponse wsTrustResponse = await _commonNonInteractiveHandler.PerformWsTrustMexExchangeAsync(
                    userRealmResponse.FederationMetadataUrl,
                    userRealmResponse.CloudAudienceUrn,
                    UserAuthType.IntegratedAuth).ConfigureAwait(false);

                // We assume that if the response token type is not SAML 1.1, it is SAML 2
                _userAssertion = new UserAssertion(wsTrustResponse.Token, (wsTrustResponse.TokenType == WsTrustResponse.Saml1Assertion) ? OAuthGrantType.Saml11Bearer : OAuthGrantType.Saml20Bearer);
            }
            else
            {
                throw new AdalException(AdalError.UnknownUserType);
            }
        }
    }

由于我的设置中的所有内容都是通过AAD管理的,所以我看不到为什么需要“联合”用户帐户类型才能检索令牌。

所以我怀疑我需要以其他方式获取令牌!? 任何帮助将不胜感激;)

1 个答案:

答案 0 :(得分:0)

经过调查,我们发现以上代码(ADAL.Net)仅可用于联合设置。

联合身份验证意味着您拥有一个本地网络-存放Windows用户帐户-已连接到Azure AD网络-该网络随后将这些帐户“联合”到Azure AD。但是,最好让ADAL小组的成员对此发表评论。

可以使用以下代码在纯Azure AD(托管设置)中为Windows用户帐户获取令牌:

var connString = $"RunAs=App;AppId={appId};TenantId={tenantId};AppKey={appKey};";
var azureServiceTokenProvider = new AzureServiceTokenProvider(connString2);
var accessToken = azureServiceTokenProvider.GetAccessTokenAsync(service, tenantId).Result;

在这里描述:https://docs.microsoft.com/en-us/azure/key-vault/service-to-service-authentication#running-the-application-using-managed-identity

同样,它的文档记录也不够好,因此,Microsoft提供的任何清晰信息都将是不错的选择。