2016-11-04 73 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錯誤的情況下運行。

相關問題