2016-11-04 70 views
1

我正在编写一个C#.NET应用程序。它连接到我们在配置为使用AAD的Azure上的服务。反过来,我们的服务尝试通过EWS拨打电话给Exchange。调用AuthenticationContext.AcquireToken导致“注册多因素身份验证”异常

所有这一切对我来说都很好。但是,我刚刚收到一个新的开发框,现在完全相同的客户端/服务代码无法正确认证。

一切似乎运行良好,直到我们的服务调用AuthenticationContext.AcquireToken。此时,AdalException引发此消息:

AADSTS50079:由于您的管理员进行了配置更改,或者因为您搬到新位置,您必须注册多因素身份验证才能访问“00000002- 0000-0ff1-ce00-000000000000' 。 跟踪ID:1bf25608-ed26-477b-a2b4-379e20705260 相关ID:449b5dce-dcb0-4d6a-83f2-dc906bbfd7c7 时间戳:2016年11月4日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); 
+0

你可以分享你用来获取访问令牌的代码吗? –

+0

我添加了一些我上面提到的原始问题的代码。这是你寻找的东西吗? –

回答

1

下面是我最终解决了这一问题:如果AcquireToken被抛出AdalException由于这个MFA错误,服务器还应该发回JSON内容,告诉你你的令牌丢失了什么(特别是MFA)。您可以从JSON(How can I retrieve the JSON response from an AdalException?)中获得声明,然后将它们发送回您的客户端(或用户正在与之交互的任何代码),并将这些丢失的声明反馈到请求中以最初获取用户令牌。

在我而言,这意味着获得来自JSON的要求,通过他们回到我的客户,然后把债权分为传递到RequestTokenAsync我WebTokenRequest对象:

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错误的情况下运行。

相关问题