簡體   English   中英

在 Xamarin.Forms 中使用 MSAL 獲取 Azure B2C SignUpSignIn 應用程序聲明

[英]Getting Azure B2C SignUpSignIn Application Claims using MSAL in Xamarin.Forms

我正在創建一個 Xamarin.Forms 應用程序,使用 Azure B2C 和 MSAL( Microsoft.Identity.Client NuGet 包)對用戶進行身份驗證。 當應用程序打開時,我嘗試使用以下代碼在后台對它們進行身份驗證:

AuthenticationResult ar;
ar = await App.AuthenticationClient.AcquireTokenSilentAsync(Scopes,
                                       userIdentifier, Authority, 
                                       SignUpSignInpolicy, false);

如果失敗,應用程序會切換並使用標准的AquireTokenAsync()方法對它們進行身份驗證。

AuthenticationResult ar;
ar = await App.AuthenticationClient.AcquireTokenAsync(Config.Scopes, 
                                       "", UiOptions.SelectAccount, 
                                       string.Empty, null, Config.Authority, 
                                       Config.SignUpSignInpolicy);

我正在使用的SignUpSignInpolicy具有電子郵件、名字和姓氏、對象 ID 和生日的應用程序聲明,這是一個自定義字符串屬性。

我想要做的是獲取經過身份驗證的用戶的電子郵件、姓名和生日(如果他們必須登錄),以便我可以從該數據創建一個用戶對象,該對象將在整個應用程序中使用。 有沒有辦法從AuthenticationResult獲取這些數據? 如果沒有,我該如何檢索SignUpSignIn應用程序聲明? 我是身份驗證的新手,所以我可能遺漏了一些重要的東西。

您通過應用程序聲明刀片配置的聲明包含在id token 中

id 令牌可通過AuthenticationResultIdToken屬性獲得。 IdToken 是 Base64 編碼的 JWT,您可以通過實例化JwtSecurityToken類來訪問它。 此類將使您可以通過 Claims 屬性訪問聲明。

注意:為了訪問 JwtSecurityToken 類,您需要包含System.IdentityModel.Tokens.Jwt nuget 包

下面是一些示例代碼,可幫助您檢索給定的聲明。:

var claimName = "given_name"; // This could also be any of your custom attributes, e.g. "extension_gamertag"
authResult = await client.AcquireTokenAsync(Config.Scopes, 
                                   "", UiOptions.SelectAccount, 
                                   string.Empty, null, Config.Authority, 
                                   Config.SignUpSignInpolicy);

var jwt = new JwtSecurityToken(authResult.IdToken);
Console.WriteLine(jwt.Claims.First(c => c.Type == claimName).Value);
   

編輯 2017-03-17由於 System.IdentityModel.Tokens.Jwt 不適用於 Xamarin/PCL,您可以使用 Newtonsoft.Json nuget 包(使用 Newtonsoft.Json.Linq)自己處理令牌;

var jwtPayloadEnc = authResult.IdToken.Split('.')[1];
var jwtPayload = Encoding.UTF8.GetString(System.Convert.FromBase64String(jwtPayloadEnc));

var payload = JObject.Parse(jwtPayload);

Console.WriteLine(payload[claimName].ToString());

編輯 2021-12-07 (以及之后的大流行)根據Olias下面的評論,對於 Xamarin,您可以使用:

var jwt = new JwtSecurityToken(authResult.IdToken);

您需要確保設置從您的策略返回的應用程序聲明與您在客戶端應用程序中的期望一致。 您需要為每個策略執行此操作。 然后,聲明將出現在作為 AuthenticationResult 一部分傳回的令牌中 示例代碼包括如何從令牌中讀出聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM