我可以使用我的 JWT 进行身份验证,但我的名称声明在我的 ASP.NET Core 应用程序中无法识别

Posted

技术标签:

【中文标题】我可以使用我的 JWT 进行身份验证,但我的名称声明在我的 ASP.NET Core 应用程序中无法识别【英文标题】:I can Authenticate with my JWT but my Name claim is not recognised in my ASP.NET Core application 【发布时间】:2019-11-13 01:59:58 【问题描述】:

我可以使用 JWT 对我的 ASP.NET Core 2.2 Web api 进行身份验证,但 IdentityName 属性为空。

不过,声明就在那里。

这是被分解的 JWT:


  "id": "1-A",
  "name": "Pure Krome",
  "email": "<snip>",
  "picture": "https://<snip>",
  "locale": "en-au",
  "permissions": [
    <snip>
  ],
  "iss": "<snip>",
  "sub": "google-oauth2|<snip>",
  "aud": "<snip>",
  "exp": 1597609078,
  "iat": 1496325742

这是服务器所看到的:

也..它似乎“识别”了我的电子邮件声明,但是? (注意:我只是混淆了真正的电子邮件值)

所以我认为name 不是公认的声明.. 所以我尝试查看是否有一些标准规则并找到IANA has a list of reserved and custom claims。 name 是自定义声明的第一个。

我需要做一些技巧来让 ASP.NET Core 安全性将我的 name 声明识别为 NameClaimType 吗?

为什么email 声明会得到认可?

【问题讨论】:

没有阅读所有细节(现在时间不多),我记得一个较旧的案例:***.com/questions/41830898/…,这有帮助吗? 您可以通过其验证设置 AFAIK 在身份验证方案上设置 NameClaimType。现在期待不同的声明类型。 @juunas >现在期待不同的索赔类型。你有一些额外的信息来解释你的建议吗? 您可以设置为:.AddJwtBearer(o =&gt; o.TokenValidationParameters = new TokenValidationParameters NameClaimType = "name" )。这将改变它用于填充名称的声明。 有一组从 JWT 声明到 MS 声明 here 的映射。如您所见,有一个来自email 的映射,但不是来自name 的映射,这就是为什么一个有效而另一个无效的原因。您还会看到 unique_name 映射到更详细的 name 声明版本。 【参考方案1】:

它预期的声明类型与您的声明类型不同。 你可以这样设置:

.AddJwtBearer(o => o.TokenValidationParameters = new TokenValidationParameters

    NameClaimType = "name"
)

这将改变它用于填充名称的声明。

【讨论】:

以上是关于我可以使用我的 JWT 进行身份验证,但我的名称声明在我的 ASP.NET Core 应用程序中无法识别的主要内容,如果未能解决你的问题,请参考以下文章

使用 AspNet Core 2.0 进行 Google JWT 身份验证

Rails:使用敲门对 JWT 令牌进行身份验证

使用oidc的JWT使用不同数量的客户端进行身份验证

ASP.NET Web API 的 JWT 身份验证

ASP.NET Web API 的 JWT 身份验证

ASP.NET Web API 的 JWT 身份验证