Azure AD B2C:如何从MFA对应的访问令牌中获取电话号码?
解决从C#中获取MFA关联电话号码的问题
首先明确:用于MFA的电话号码不会默认包含在access token的claims中,因为access token的核心作用是资源授权,不会携带这类敏感的用户MFA配置信息。你可以通过以下几种方式获取:
调用身份提供商的用户信息/认证方法API
主流身份服务(如Azure AD、Auth0)都提供专门的API来获取用户的详细资料,包括MFA绑定的手机号。比如针对Azure AD,你可以用有效的access token调用Microsoft Graph API的认证方法接口,获取用户的MFA手机号:using System.Net.Http.Headers; using System.Text.Json; var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "你的access token"); // 请求用户的MFA认证方法 var response = await httpClient.GetAsync("https://graph.microsoft.com/v1.0/me/authentication/methods"); if (response.IsSuccessStatusCode) { var jsonContent = await response.Content.ReadAsStringAsync(); var authMethods = JsonDocument.Parse(jsonContent).RootElement.GetProperty("value"); // 筛选出手机号类型的MFA方法 foreach (var method in authMethods.EnumerateArray()) { if (method.GetProperty("@odata.type").GetString() == "#microsoft.graph.phoneAuthenticationMethod") { string phoneNumber = method.GetProperty("phoneNumber").GetString(); // 拿到手机号 break; } } }注意:调用这类API需要提前申请对应的权限(比如Azure AD的
UserAuthenticationMethod.Read)。检查ID Token而非Access Token
部分身份提供商会将用户手机号放在ID Token的phone_numberclaim中,而非access token。你可以尝试解码ID Token,查看是否包含该字段:using System.IdentityModel.Tokens.Jwt; var handler = new JwtSecurityTokenHandler(); var idToken = handler.ReadJwtToken("你的ID Token字符串"); var phoneClaim = idToken.Claims.FirstOrDefault(c => c.Type == "phone_number"); if (phoneClaim != null) { string phoneNumber = phoneClaim.Value; }从自有用户数据库查询(自建身份系统场景)
如果是你自己搭建的身份认证系统,MFA手机号通常会直接存储在用户数据库中。你可以通过当前用户的唯一标识(比如token中的subclaim),直接从数据库中查询对应的手机号。
内容的提问来源于stack exchange,提问作者inno
相关产品推荐
相关产品推荐

