我正在编写一个c# . net应用程序。它连接到我们在Azure上的服务,该服务配置为使用AAD。反过来,我们的服务尝试通过EWS呼叫Exchange。
这一切过去对我来说都很好。然而,我刚得到一个新的开发盒,现在完全相同的客户端/服务代码无法正确验证。
一切似乎都运行良好,直到我们的服务调用AuthenticationContext.AcquireToken。此时,抛出AdalException,并带有以下消息:
AADSTS50079:由于管理员更改了配置,或者由于您搬到了新位置,您必须注册多因素身份验证才能访问'00000002-0000-0ff1-ce00-000000000000'。产品编号: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中获取声明(我如何从AdalException中检索JSON响应?),然后将它们发送回您的客户端(或与用户交互的任何正在运行的代码),并将这些丢失的声明返回到请求中以初始获取用户令牌。
在我的例子中,这意味着从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错误。