gpt4 book ai didi

authentication - 没有从 JWT token 创建用户身份

转载 作者:行者123 更新时间:2023-12-04 13:44:27 24 4
gpt4 key购买 nike

我有一个使用 JwtBearer 身份验证的 .Net Core 2 Web API 项目。但是,虽然这适用于验证我的用户并尊重 [Authorize]我的 Controller 上的属性,永远不会填充用户身份和声明。我还需要做些什么来确保为我的经过身份验证的用户创建 ClaimsIdentity 吗?

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
...
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://myTenant.auth0.com";
options.Audience = "https://localhost:5001/api/v1";
options.RequireHttpsMetadata = false;

options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "myTenant.auth0.com",
ValidAudience = "https://localhost:5001/api/v1"
};
});
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, SystemModelBuilder modelBuilder)
{
...
app.UseHttpsRedirection();
app.UseAuthentication();
}

我的 token 在 jwt.ms 上看起来像这样:
{
"typ": "JWT",
"alg": "RS256",
"kid": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
.{
"profileData": {
"given_name": "Rodd",
"family_name": "Harris"
},
"iss": "https://myTenant.auth0.com/",
"sub": "auth0|37b5f5c54fdac",
"aud": [
"https://localhost:5050/api/v1/",
"https://myTenant.auth0.com/userinfo"
],
"iat": 1532628090,
"exp": 1532629290,
"azp": "2RdsNtKpUgh_wgB3NI6gxd-OAl",
"scope": "openid profile email app.client.read"
}.[Signature]

在我的 Controller 中,我有这样的东西:
[ApiController]
[Route("api/v1/[controller]")]
[Authorize]
public class TestController : ControllerBase
{
[HttpGet("clients")]
public async Task<IActionResult> ClientsList()
{
//Debugger gets here -- user is authenticated
var user = HttpContext.User.Identity.Name; //Always null
var count = HttpContext.User.Claims.Count(); //Always 0
var allowed = HttpContext.User.IsAuthenticated; //Always true
var type = HttpContext.User.AuthenticationType; //AuthenticationTypes.Federated
...
}

是什么阻止创建用户的名称和声明?

更新

所以我才意识到我实际上正在将声明映射到 HttpContext.User.Identity.Claims .还意识到我的 token 没有名称值来自动映射到身份。所以,我想我真正的问题是,如何覆盖自定义映射并将我自己的 token 映射到身份?

最佳答案

感谢信息herehere ,我能够弄清楚发生了什么。

首先,.Net 显然试图通过查找由键标识的声明来自动映射 token 声明:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name .当然,我的 token 中没有这个——所以没有默认名称映射。

事实上,我意识到我的 token 中没有传递任何名称——所以我必须在 Auth0 上设置一个规则来包含一些用作名称的东西。 (我确实在 app_metadata 中有一个名称,但我需要将其展平为单独的值)。

完成后,我只需要告诉 .Net 使用不同的键在 token 声明列表中查找名称声明。我在 Startup.cs 中这样做:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
...
//There is no magic to this string -- it is whatever claim key is being
//issued by the Auth Provider
NameClaimType = "https://myshcemadefinedkey/preferred_username"
}
}

有了这个,.Net 开始用与具有相应键值的 token 声明关联的值填充 User.Identity.Name 值。

关于authentication - 没有从 JWT token 创建用户身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com