asp.net-core - 如何通过接口获取当前登录的用户名以在asp.net core mvc中按列更新?
问题描述
我想创建一个更新的列,因此每当用户修改数据时,更新的列都会填充当前登录的用户名。我想使用一个接口来获取当前登录用户的名称,然后在 AppDbContext 中的 savechanges 方法中,每当更新数据时插入用户名。请有人帮我解决一下,因为我是 ASP.NET 核心 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
(和此用户名)。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 对象中所示。不确定你真正需要什么。
推荐阅读
- architecture - 授权架构
- java - 重新启动 Storm 时再次处理来自 Kafka 的所有预处理记录
- java - Junit - 带有thread.sleep的测试用例不等待线程完成
- python - 如何调用 self 方法并在烧瓶中获取数据?
- kubernetes - 如何在等待 kubelet 将控制平面作为静态 Pod 从目录“/etc/kubernetes/manifests”启动时修复超时
- javascript - JavaScript array.includes 返回 false(比较来自链接数组的用户输入)
- python - BeautifulSoup - 如何从更深层的 html 中提取信息
- html - 添加到叠加图像的链接
- javascript - window.open() 打不开网站,怎么办?
- amazon-web-services - Get Account ID from Account Alias (boto3)