EF Core:在影子属性中获取经过身份验证的用户名

Posted

技术标签:

【中文标题】EF Core:在影子属性中获取经过身份验证的用户名【英文标题】:EF Core: Get Authenticated username in Shadow Properties 【发布时间】:2018-07-11 06:57:36 【问题描述】:

作为记录谁输入/更新数据的一部分,我将在所有实体中添加 4 个通用字段(创建者、创建日期、修改者、修改日期)。为此,我正在使用多个论坛中建议的影子属性功能,包括https://dotnetcore.gaprogman.com/2017/01/26/entity-framework-core-shadow-properties/

我的问题是如何获取有关经过身份验证的用户的信息?。如果它是一个控制器,我可以访问 ApplicationUserManager 但在这种情况下,阴影属性位于

AppDbContext : IdentityDbContext 类。

这是一个 asp.net core 2 web API 项目。

非常感谢任何建议。谢谢

【问题讨论】:

【参考方案1】:

您可以使用HttpContext.User.Identity.Name 获取当前用户的名称。您可以使用IHttpContextAccessor 访问HttpContext。该接口应该已经在服务集合中注册。否则,您可以注册它:

public void ConfigureServices(IServiceCollection services)

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddDbContext<ApplicationDbContext>(options =>
         options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    // ...

那么,你就可以从DbContext使用这个接口了:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

    private readonly IHttpContextAccessor _httpContextAccessor;

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor)
        : base(options)
    
        _httpContextAccessor = httpContextAccessor;
    

    public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
    
        var httpContext = _httpContextAccessor.HttpContext;
        if(httpContext != null)
        
            var authenticatedUserName = httpContext.User.Identity.Name;

            // If it returns null, even when the user was authenticated, you may try to get the value of a specific claim 
            var authenticatedUserId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value
            // var authenticatedUserId = _httpContextAccessor.HttpContext.User.FindFirst("sub").Value

            // TODO use name to set the shadow property value like in the following post: https://www.meziantou.net/2017/07/03/entity-framework-core-generate-tracking-columns
        

        return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
    

【讨论】:

感谢您的建议。即使在服务集合中注册 IHttpContextAccessor 后,我也会得到 NULL。任何建议.... 哪个属性为空:_httpContextAccessor.HttpContext_httpContextAccessor.HttpContext.User.Identity.Name _httpContextAccessor.HttpContext.User.Identity.Name 为空 只有在用户在 aspnet 管道中通过身份验证后,您才应该调用 SaveChanges。您可以使用_httpContextAccessor.HttpContext.User.Identity.IsAuthenticated 检查用户是否已通过身份验证 是的,我已经这样做了。即使用户通过了身份验证,Name 也是 null.....

以上是关于EF Core:在影子属性中获取经过身份验证的用户名的主要内容,如果未能解决你的问题,请参考以下文章

为啥我没有在经过 Windows 身份验证的 Web Core API 中获得我的用户名?

OpenFire:在 IQHandler 中,如何获取发送它的经过身份验证的用户?

如何在 spring-security-oauth 中获取经过身份验证的用户

如何从.Net Core API 中的身份验证 JWT 令牌中获取身份用户?

在 Flutter 的下拉列表中从 Firebase 获取经过身份验证的用户列表

如何从 Firebase 数据库中获取经过身份验证的用户?