如何使用Identity在ApplicationDbContext中获取当前登录的用户ID? [英] How do I get the current logged in user ID in the ApplicationDbContext using Identity?

查看:18
本文介绍了如何使用Identity在ApplicationDbContext中获取当前登录的用户ID?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已使用Visual Studio中的模板创建了一个.Net core 2.1 MVC应用程序,其中带有标识预设(存储在应用程序中的用户帐户),并且我正在尝试自动执行某些审核字段。

基本上,我尝试做的是重写SaveChangesAsync()方法,以便每当对实体进行更改时,当前登录的用户ID都会设置为CreatedBy或ModifiedBy的审核属性,这些属性是作为实体的影子属性创建的。

我看过似乎成堆的答案,但令人惊讶的是,它们都不适用于我。我曾尝试注入IHttpContext、HttpContext、UserManager,但我似乎无法访问返回用户ID的方法,或者我收到了循环依赖错误,我不太明白为什么会发生这种情况。

这一次我真的要绝望了。我认为这样的事情应该很简单,但我真的很难弄清楚怎么做。似乎有针对Web API控制器或MVC控制器的有详细文档记录的解决方案,但没有在ApplicationDbContext中使用。

如果有人能帮助我,或者至少给我指个正确的方向,我将不胜感激,谢谢。

推荐答案

感谢所有答案。最后,我决定创建一个UserResolveService,它通过DI接收HttpConextAccessor,然后可以获取当前用户名。有了这个名字,我就可以查询数据库以获得我可能需要的任何信息。然后,我将此服务注入到ApplicationDbContext。

IUserResolveService.cs

public interface IUserResolveService
{
    Task<string> GetCurrentSessionUserId(IdentityDbContext dbContext);
}

UserResolveService.cs

public class UserResolveService : IUserResolveService
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public UserResolveService(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public async Task<string> GetCurrentSessionUserId(IdentityDbContext dbContext)
    {
        var currentSessionUserEmail = httpContextAccessor.HttpContext.User.Identity.Name;

        var user = await dbContext.Users                
            .SingleAsync(u => u.Email.Equals(currentSessionUserEmail));
        return user.Id;
    }
}

您必须在启动时注册服务并将其注入到ApplicationDbContext中,您可以这样使用它:

ApplicationDbConext.cs

var dbContext = this;

var currentSessionUserId = await userResolveService.GetCurrentSessionUserId(dbContext);

这篇关于如何使用Identity在ApplicationDbContext中获取当前登录的用户ID?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆