如何通过接口获取当前登录的用户名,以在asp.net core mvc中按列插入更新?

问题描述

我想创建一个由更新的列,因此,每当用户修改数据时,更新的列将填充当前登录的用户名。我想使用一个接口,该接口获取当前登录用户的名称,然后在AppDbContext中的savechanges方法中,每当数据更新时就插入用户名。请问有人帮我解决该问题,因为我是ASP.NET core mvc的新手,我从大学获得了作业。我真的要感谢所有经验丰富的程序员。

解决方法

希望我能很好地理解你的问题。在这里:

如果您要检索有关向服务器发送请求的用户的某些信息,并且您使用默认的身份行为,那么它应该很容易。我不知道您使用什么版本的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(和该用户名)的用户名。如果您使用依赖项注入(在ASP.NET中“自动”使用),将注入IHttpContextAccessor

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;
    }
}

您可以将此服务添加到您的服务中,并且可以在各个位置注入它。我什至可以注入您的数据库环境。

// Startup.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对象中所示。不知道您真正需要什么。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...