You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复ASP.NET中声明类型错误?Google OAuth无法获取性别与出生日期

解决Google OAuth无法获取性别和出生日期的问题

问题原因

Google OAuth默认不会返回性别和出生日期信息,核心原因有两点:

  1. 权限范围不足:默认的profile、email权限不包含性别和生日的读取权限,需要额外申请专属scope。
  2. Claim映射不匹配:Google返回的性别、生日字段名与.NET的ClaimTypes默认映射不对应,直接用ClaimTypes.Gender和ClaimTypes.DateOfBirth无法找到对应值。

解决方案

1. 添加所需的OAuth权限范围

在配置Google OAuth时,必须添加读取性别和生日的专属权限:

services.AddAuthentication().AddGoogle(options =>
{
    options.ClientId = "你的ClientID";
    options.ClientSecret = "你的ClientSecret";
    // 添加性别读取权限
    options.Scope.Add("https://www.googleapis.com/auth/user.gender.read");
    // 添加出生日期读取权限
    options.Scope.Add("https://www.googleapis.com/auth/user.birthday.read");
});

2. 正确获取性别和出生日期

有两种方式可以获取对应数据:

方式一:直接读取Google专属Claim类型

Google会将性别和生日以自定义Claim类型返回,直接通过对应字符串查找:

var gender = info.Principal.FindFirstValue("urn:google:gender");
var dateOfBirth = info.Principal.FindFirstValue("urn:google:birthdate");

方式二:配置Claim映射(推荐)

如果想继续使用.NET的ClaimTypes枚举,可以在配置中添加映射规则,将Google返回的JSON字段映射到标准Claim类型:

services.AddAuthentication().AddGoogle(options =>
{
    options.ClientId = "你的ClientID";
    options.ClientSecret = "你的ClientSecret";
    options.Scope.Add("https://www.googleapis.com/auth/user.gender.read");
    options.Scope.Add("https://www.googleapis.com/auth/user.birthday.read");

    // 映射性别到ClaimTypes.Gender
    options.ClaimActions.MapJsonKey(ClaimTypes.Gender, "gender");
    // 映射出生日期到ClaimTypes.DateOfBirth
    options.ClaimActions.MapJsonKey(ClaimTypes.DateOfBirth, "birthdate");
});

配置完成后,即可用你原来的代码获取数据:

var gender = info.Principal.FindFirstValue(ClaimTypes.Gender);
var dateOfBirth = info.Principal.FindFirstValue(ClaimTypes.DateOfBirth);

额外注意事项

  • 用户的Google账号必须已填写性别和出生日期信息。
  • 用户在授权时必须同意应用读取这些敏感信息,否则仍会返回Null。

内容的提问来源于stack exchange,提问作者Christian Medallada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:52:32