我已使用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?
发布评论