首页 > 解决方案 > 如何通过接口获取当前登录的用户名以在asp.net core mvc中按列更新?

问题描述

我想创建一个更新的列,因此每当用户修改数据时,更新的列都会填充当前登录的用户名。我想使用一个接口来获取当前登录用户的名称,然后在 AppDbContext 中的 savechanges 方法中,每当更新数据时插入用户名。请有人帮我解决一下,因为我是 ASP.NET 核心 mvc 的新手,而且我得到了大学的作业。我将非常感谢这里所有经验丰富的程序员。

标签: asp.net-coreserviceinterfaceentity-framework-coreasp.net-identity

解决方案


我希望我能很好地理解你的问题。它是这样的:

如果您想检索有关向您的服务器发送请求的用户的一些信息并且您使用默认身份行为,那么它应该很容易。我不知道你使用的是什么版本的 ASP.NET,我会假设它的 ASP.NET Core 3(来自你的标签等)。

对于每个请求,都有一个HttpContext对象可以记住有关 HTTP 请求、HTTP 响应等的信息。如果您从Controller/继承控制器,则ControllerBase可以直接访问该上下文。上下文包含一个名为“ User”的属性,其中包含各种信息,包括您的用户名。

[AllowAnonymous]
[HttpGet("me")]
public string WhoAmI()
{
     //Try this
     var userName = HttpContext.User?.Identity?.Name;

     //Or even
     var userName = User?.Identity?.Name;

     return userName;
}

现在,如何为您的AppDbContext上下文获取此名称?首先,最好的方法是创建一个为您提供此名称的服务。让我们称之为UserRepository。用户存储库将接受IHttpContextAccessor为您提供的HttpContext(和此用户名)。IHttpContextAccessor如果您使用依赖注入(在 ASP.NET 中“自动”使用),则将被注入。

public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserRepository(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void GetCurrentUserName()
    {
        var username = _httpContextAccessor.HttpContext.User.Identity.Name;
        return username;
    }
}

您可以将此服务添加到您的服务中,并且可以将其注入到各个地方。我什至应该可以注入您的数据库上下文。

启动.cs

public void ConfigureServices(IServiceCollection services)
{
     services.AddControllersWithViews(); //You probably have this one
     services.AddHttpContextAccessor(); //Add the context accessor
     services.AddTransient<IUserRepository, UserRepository>(); //This is our user repository
}

您应该能够将其用作:

public class AppDb : DbContext
{
    readonly IUserRepository userRepo;

    public AppDb(DbContextOptions<AppDb> options,
        IUserRepository userRepo) 
        : base(options)
    {
        this.userRepo = userRepo;

        userRepo.GetCurrentUserName();
    }
}

IUserRepository“自动”注入每个请求。

或者,您可以在IUserRepository任何需要的地方注入。例如在 Controller 的构造函数中,类似于 AppDb 对象中所示。不确定你真正需要什么。


推荐阅读