2017-02-16 119 views
0

我有一個使用ADAL的客戶端/服務器身份驗證的工作版本。但是,當您想要使用本地帳戶(即,只是一個用戶名或只是一個沒有AAD以外的驗證碼的電子郵件地址)時,B2C AAD似乎不適用於ADAL。看來我們應該用於本地帳戶的API是MSAL的alpha版本。到現在爲止還挺好。我能創建使用圖形API和使用下面的代碼的本地用戶,我似乎驗證本地用戶「[email protected]」:您如何使用MSAL驗證AAD B2C?

 this.pca = new PublicClientApplication("a4828eaa-42f6-418a-8062-f857130b69ce"); 
     AuthenticationResult result = await this.pca.AcquireTokenAsync(
      new string[] { "a4828eaa-42f6-418a-8062-f857130b69ce" }, 
      string.Empty, 
      UiOptions.ForceLogin, 
      null, 
      null, 
      "https://login.microsoftonline.com/" + "darkbondpublic.onmicrosoft.com", 
      "B2C_1_sign-in"); 

的問題是,我通過安全使用WCF中的自定義安全令牌機制將'result.Token'中的令牌返回給服務器。服務器,該服務器使用ADAL上工作的代碼,似乎不再接受來自上面的調用安全令牌:

JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); 
Microsoft.IdentityModel.Tokens.SecurityToken securityToken = null; 
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(userName, this.GetTokenValidationParameters(MetadataAddress), out securityToken); 
Thread.CurrentPrincipal = claimsPrincipal; 

的錯誤信息是:

enter image description here

誰能告訴我在這裏發生了什麼?我需要在服務器上進行身份驗證的另一種方法嗎?

+0

什麼是價值的元數據地址? – Saca

+0

private const string MetadataAddress =「https://login.microsoftonline.com/14be7990-15db-4988-bd5e-3ad4d6a16a32/federationmetadata/2007-06/federationmetadata.xml」 來自經典門戶。我沒有在新門戶中找到「端點」位置。我有一些GITHUB演示代碼可以從返回的元數據中提取簽名證書,但是,老實說,我找不到關於這個東西的白皮書,所以我不知道它有多潔淨。它適用於ADAL。 –

回答

5

您爲Azure AD B2C租戶配置的元數據端點不正確。這是正確的,供大家參考:

https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration?p=B2C_1_Sign_In 

我們可以發現從如下面的圖新Azure的門戶網站的具體政策的元數據。 enter image description here

而且在元數據應該能看清按鍵端點象下面這樣:

https://login.microsoftonline.com/{tenant}/discovery/v2.0/keys?p={policy} 

我們可以找到與孩子gfIKIH-yZ3phRHRyjnsHIqZMaePLGAELzPat0CNY4sA關鍵像下圖: enter image description here

+0

這看起來好像有正確的數據,但我在這個問題上已經浪費了很多時間。任何機會,你會指向我的一些代碼,從端點下載JSON,反序列化它並構造** TokenValidationParameters **構造函數的參數? –

+0

TokenValidationParameters的大部分參數取決於您 - 根據您的驗證細節,通用部分將設置簽名密鑰。這是下載和反序列化發現文檔的代碼:'string metadata = $「https://login.microsoftonline.com/tfp/{TenantId}/{PolicyName}/.well-known/openid-configuration」; ConfigurationManager configurationManager = new ConfigurationManager (metadata); OpenIdConnectConfiguration configuration = configurationManager.GetConfigurationAsync()。Result;' – user7567234

+0

然後你可以設置:'TokenValidationParameters parameters = new TokenValidationParameters(); ();選擇多個(t => t.SecurityKeys);''選擇多個(t => t.SecurityKeys);''參數.IssuerSigningKeys = configuration.JsonWebKeySet.GetSigningTokens – user7567234

3

我認爲這個問題是:你發送請求到V1點,但AAD B2C使用V2端點的權限:https://login.microsoftonline.com/tfp/{} tenantId/{} policyName /v2.0/

元數據V2端點可在https://login.microsoftonline.com/tfp/{} tenantId/{} policyName /.well-known/openid-configuration

您可以更新您的網址,並作一次嘗試?

要查看Azure的門戶網站的權威選擇策略,然後:

  1. 找到你的政策
  2. 點擊 「編輯」
  3. 點擊 「令牌,會話& SSO配置」
  4. 展開「 Issuer聲稱「

Azure(使用V1端點)和Azure AD B2C(使用V2端點)使用不同的se t密鑰來簽署令牌,因此從正確的位置下載公鑰是很重要的 - 最初是從V1下載的,但需要使用V2。

+0

看起來這也是正確的答案。 –

相關問題