相关疑难解决方法(0)

如何获得asp.net核心的当前用户

我想让当前用户获取用户的信息,例如电子邮件.但我不能在asp.net核心中这样做.我很困惑这是我的代码.

HttpContext在控制器的构造函数中几乎为null .在每个动作中获得用户并不好.我想获得用户的信息并将其设置为ViewData;

public DashboardController()
{
    var user = HttpContext.User.GetUserId();
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-identity asp.net-core

100
推荐指数
9
解决办法
12万
查看次数

如何在服务层获取用户

我使用ASP.NET Core 2.1并希望User服务级别获取.

我已经看到了HttpContextAccessor注入某个服务然后我们获取当前User通道的示例UserManager

var user = await _userManager.GetUserAsync(accessor.HttpContext.User);
Run Code Online (Sandbox Code Playgroud)

或在控制器中

var user = await _userManager.GetUserAsync(User);
Run Code Online (Sandbox Code Playgroud)

问题:

  • 注入HttpContextAccessor服务似乎是错误的 - 仅仅因为我们违反了SRP并且服务层没有被隔离(它依赖于http上下文).

  • 我们当然可以在控制器中获取用户(一种更好的方法),但我们面临两难 - 我们根本不想User在每个服务方法中作为参数传递

我花了几个小时思考如何最好地实现它,并提出了一个解决方案.我不完全确定我的方法是否足够,并且不违反任何软件设计原则.

共享我的代码希望从StackOverflow社区获得建议.

这个想法如下:

首先,我介绍SessionProvider哪些注册为Singleton.

services.AddSingleton<SessionProvider>();
Run Code Online (Sandbox Code Playgroud)

SessionProvider具有Session用于保持属性User,Tenant等等.

其次,我介绍SessionMiddleware并注册它

app.UseMiddleware<SessionMiddleware>();
Run Code Online (Sandbox Code Playgroud)

Invoke我解决的方法中HttpContext,SessionProvider&UserManager.

  • 我拿 User

  • 然后我初始化单身人士的Session属性ServiceProvider:

sessionProvider.Initialise(user);

在这个阶段ServiceProvider …

c# asp.net-core asp.net-core-middleware

7
推荐指数
1
解决办法
1572
查看次数