gpt4 book ai didi

c# - 如何在类库中访问 JWT User.Claims

转载 作者:行者123 更新时间:2023-12-04 16:04:15 25 4
gpt4 key购买 nike

我已经使用 DDD 构建了我的项目,它看起来像这样:

| CompanyName.API
| MyControllerThatRequiresJwtToken << Entry point
| CompanyName.Application
| CompanyName.Data
| EfCoreContext << I would like to get the claims here
| CompanyName.Domain
| CompanyName.IoC
| CompanyName.Test
| CompanyName.UI

我正在使用 Z.EntityFramework.Plus.Audit.EFCore 审计所有数据更改。我将它添加到 CompanyName.Data 项目中,因为这是我的 EF 上下文所在的位置。

问题是: API 中的所有请求都需要 JWT token 。我想在将保存到数据库中的审核对象中设置发送请求的人的用户名,但是我无权访问数据层中的 HttpContext。

获取此信息的最佳方法是什么?也许将 IHttpContextAccessor 注入(inject)数据层?使数据层“依赖于 Http”,这听起来不是一个好计划。

更新

我不确定如何将它从 Controller 传递到上下文。我相信它需要以某种方式注入(inject)。

的片段EfCoreContext.cs
public override int SaveChanges()
{
var audit = new Audit();
audit.CreatedBy = "JWT Username"; // << I'd need it here

audit.PreSaveChanges(this);
var rowAffecteds = base.SaveChanges();
audit.PostSaveChanges();

if (audit.Configuration.AutoSavePreAction != null)
{
audit.Configuration.AutoSavePreAction(this, audit);
base.SaveChanges();
}

return rowAffecteds;
}

最佳答案

例如,创建一个名为 IApplicationUser 的接口(interface)。给它提供你需要的只读属性,比如 id、name 等等。

创建它的实现

public class ApplicationUser : IApplicationUser
{
private readonly IHttpContextAccessor httpContextAccessor;

public ApplicationUser(IHttpContextAccessor httpContextAccessor)
{
this.httpConntextAccessor = httpContextAccessor;
}

public Guid Id => this.GetUserId();

public string Name => this.GetUserName();

private Guid GetUserId()
{
var subject = this.httpContextAccessor.HttpContext
.User.Identity.Claims
.FirstOrDefault(claim => claim.Type == JwtClaimTypes.Subject);

return Guid.TryParse(subject, out var id) ? id : Guid.Empty;
}

private Guid GetUserId()
{
return this.httpContextAccessor.HttpContext
.User.Identity.Claims
.FirstOrDefault(claim => claim.Type == JwtClaimTypes.PreferredUserName);
}
}

现在用你的 DI-Container 注册它。对于默认的 MS IOC:
services.AddScoped<IApplicationUser, ApplicationUser>();

在需要的地方注入(inject) IApplicationUser 并使用它来获取用户信息。

编辑: IHttpContextAccessor必须注册。如果不是这样,也这样做
services.AddScoped<IHttpContextAccessor, HttpContextAccessor>();

编辑 2:只是为了澄清。这并不意味着在存储库中使用,或者您想如何称呼它。重新思考您的逻辑,以便您可以在保存数据之前将该信息传递给您的实体。

关于c# - 如何在类库中访问 JWT User.Claims,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52050501/

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