gpt4 book ai didi

c# - 如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:24 24 4
gpt4 key购买 nike

MyDbContext 中,我有方法 LogChanges,它使用以下信息在我的logs 表中记录所有更改:

TableName = entityName,
IDRow = JsonConvert.SerializeObject(primaryKeys),
Value = JsonConvert.SerializeObject(values),
Date = dateTimeNow,
Author = userFromJWT

我想将 Author 设置为通过 JWT 授权的 User。从这部分 Exactly:

"sub": "myUserName"

如何在 MyDbContext 中获取该用户名?也许是某种依赖注入(inject)?

提前致谢!

@解决方案

Startup.cs

   public void ConfigureServices(IServiceCollection services) {
// ...
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Issuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
services.AddHttpContextAccessor();
//...
}

MyDbContext.cs

// ...
private readonly IHttpContextAccessor _httpContext;

public MyDbContext(DbContextOptions options, IHttpContextAccessor httpContext) : base(options) {
_httpContext = httpContext;
}
//..

并从我使用的 JWT 的声明中获取名称(来自“sub”)

_httpContext.HttpContext.User.Claims.SingleOrDefault(
c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier")?.Value

最佳答案

假设您实际上已经集成到 ASP.NET Core 身份验证子系统(即 services.AddAuthenticationapp.UseAuthentication),那么这基本上已经为您处理了。将读取 JWT 以从中构建一个 ClaimsPrincipal 实例,然后将其存储在 HttpContext.User 中。因此,用户的用户名将位于 HttpContext.User.Identity.Name 的标准位置,或者您可以通过 Claims 集合直接访问它(以及任何其他声明)在 HttpContext.User.Identity 上。

如果问题是您需要此信息的某个地方您无法直接访问 HttpContext.User(基本上是 Controller 或 View 之外的任何地方),那么您只需注入(inject)IHttpContextAccessor。这需要两件事:

  1. 您必须添加 IHttpContextAccessor 服务。出于性能原因,默认情况下不包含它。 (这并不是说它对性能有严重影响。只是如果你不需要它,你可以通过不包含它来获得更多的性能。ASP.NET Core 就是只包含你需要的东西需要包括。)无论如何:

    ASP.NET 核心 2.1

    services.AddHttpContextAccessor();

    以前的版本

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
  2. 无论您在何处注入(inject),它都需要成为请求管道的一部分,否则,HttpContext 将不存在。这应该不是问题,因为无论如何你都依赖于 JWT 的存在。请记住,您不能在常规控制台应用等中使用它。

关于c# - 如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50837167/

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