Azure active directory 调用AuthenticationContext.AcquireToken将导致“0”;注册多因素身份验证”;例外

Azure active directory 调用AuthenticationContext.AcquireToken将导致“0”;注册多因素身份验证”;例外,azure-active-directory,Azure Active Directory,我正在写一个C#NET应用程序。它连接到Azure上的服务,该服务配置为使用AAD。反过来,我们的服务尝试通过EWS呼叫Exchange 所有这些过去对我来说都很好。然而,我刚刚得到一个新的开发框,现在完全相同的客户机/服务代码无法正确地进行身份验证 在我们的服务调用AuthenticationContext.AcquireToken之前,一切似乎都正常运行。此时,将抛出一个AdalException,其中包含以下消息: AADSTS50079:由于管理员更改了配置,或者由于您移动到了新位置,您

我正在写一个C#NET应用程序。它连接到Azure上的服务,该服务配置为使用AAD。反过来,我们的服务尝试通过EWS呼叫Exchange

所有这些过去对我来说都很好。然而,我刚刚得到一个新的开发框,现在完全相同的客户机/服务代码无法正确地进行身份验证

在我们的服务调用AuthenticationContext.AcquireToken之前,一切似乎都正常运行。此时,将抛出一个AdalException,其中包含以下消息:

AADSTS50079:由于管理员更改了配置,或者由于您移动到了新位置,您必须注册多因素身份验证才能访问“0000000 2-0000-0ff1-ce00-000000000000”。 记录道ID:1bf25608-ed26-477b-a2b4-379e20705260 相关ID:449b5dce-dcb0-4d6a-83f2-dc906bbfd7c7 时间戳:2016-11-04 22:48:08Z

我不确定是什么原因导致了这台新机器出现错误。如何“注册多因素身份验证”?为什么我只需要在这台机器上运行我的应用程序就可以了

谢谢

下面是我从应用程序中提取的一些身份验证代码,以便更好地了解正在发生的事情:

var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;

var upn = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn);
var email = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email);
var userName =  upn != null ? upn.Value : email?.Value;

accessToken = bootstrapContext.Token;

ClientCredential clientCred = new ClientCredential("514b1e66-32af-4e11-a9d4-f9f1f4529dc0", appKey);
UserAssertion assertion = new UserAssertion(_accessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
AuthResult = authContext.AcquireToken("https://outlook.office365.com", clientCred, assertion);

下面是我最终解决问题的方法:如果AcquireToken由于此MFA错误而引发AdalException,服务器还应该发回JSON内容,告诉您令牌丢失了什么声明(特别是MFA的声明)。您可以从JSON()中获取声明,然后将它们发回客户端(或者用户正在与之交互的任何正在运行的代码),并将这些丢失的声明反馈到请求中,以最初获取用户令牌

在我的例子中,这意味着从JSON获取声明,将它们传递回我的客户机,然后将声明放入我的WebTokenRequest对象,该对象被传递到RequestTokenAsync:

var wtr = new WebTokenRequest(
    provider: m_wap,
    scope: "",
    clientId: m_clientId,
    promptType: promptType);
...
wtr.Properties.Add("claims", ExtraClaimsToRequestWhenAuthenticating);
...
return await WebAuthenticationCoreManager.RequestTokenAsync(wtr)

现在,对RequestTokenAsync的调用在请求中缺少声明,它将返回一个不同的带有MFA声明的令牌,或者显示用户UI以完成MFA过程,然后返回一个不同的声明(根据我的经验,显示UI并不总是必要的)。然后我将此新令牌传递回我的服务,该服务调用AcquireToken并在没有MFA错误的情况下工作。

您可以共享用于获取访问令牌的代码吗?我在上面的原始问题中添加了一些我挑出的代码。这是您要找的类型吗?