如何从 Azure AD B2C 删除电子邮件声明中的括号

The*_*ang 3 c# azure-ad-b2c

email我正在尝试删除从 Azure AD B2C 获得的声明中的括号。

用户登录后,我解码用户的令牌并从中获取电子邮件。但我收到的电子邮件中有括号。该电子邮件看起来像这样["email@email.com"],当我将其保存到数据库时,它变得很难看。

是否有一些设置可以从电子邮件声明中删除括号?

JObject ParseIdToken(string idToken)
{
    // Get the piece with actual user info
    idToken = idToken.Split('.')[1];
    idToken = Base64UrlDecode(idToken);
    return JObject.Parse(idToken);
}

private string Base64UrlDecode(string s)
{
    s = s.Replace('-', '+').Replace('_', '/');
    s = s.PadRight(s.Length + (4 - s.Length % 4) % 4, '=');
    var byteArray = Convert.FromBase64String(s);
    var decoded = Encoding.UTF8.GetString(byteArray, 0, byteArray.Count());
    return decoded;
}

public  void CacheUser(AuthenticationResult ar)
{
    JObject user = ParseIdToken(ar.IdToken);
    var cache = new CachedUsers
    {
        FullName = user["name"]?.ToString(),
        Email = user["emails"]?.ToString()

    };
     BlobCache.LocalMachine.InsertObject("usercached", cache);
}
Run Code Online (Sandbox Code Playgroud)

这是我获取电子邮件的代码。为什么电子邮件有括号?我想问题不在我的代码中,但也许 Azure AD B2C 中的某些设置会导致这种情况,因为当我尝试从https://jwt.io/解码令牌时,它会返回相同的带有括号的电子邮件。有人经历过这个吗?

这是来自 jwt.io 的有效负载在此输入图像描述

您可以看到姓名和电子邮件之间的区别。该电子邮件有这样的括号[ ],我想知道如何删除这些括号并使其像名称一样。因为当我收到 Xamarin 表单中的电子邮件时,它也有这些括号,所以不是emailname@gmail.com 这样的["emailname@gmail.com"]

Sac*_*aca 5

在 JSON 中,括号表示数组。请参阅此基本JSON 数组文档。

虽然不容易通过 Azure AD B2C UI 公开,但从技术上讲,用户可以将多封电子邮件链接到其帐户,这就是电子邮件声明是一个数组的原因。

您看到的字符串之所以显示为这样,["user@email.com"]是因为您正在调用.ToString()JSON 数组。您需要修改代码以获取该数组的特定元素,例如第一个元素:

public  void CacheUser(AuthenticationResult ar)
{
    JObject user = ParseIdToken(ar.IdToken);
    var cache = new CachedUsers
    {
        FullName = user["name"]?.ToString(),
        Email = user["emails"]?.FirstOrDefault()?.ToString()
    };
     BlobCache.LocalMachine.InsertObject("usercached", cache);
}
Run Code Online (Sandbox Code Playgroud)