为了账号安全,请及时绑定邮箱和手机立即绑定

如何在ASP.NET Core中获得当前用户

/ 猿问

如何在ASP.NET Core中获得当前用户

慕雪9262066 2020-02-01 15:13:47

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


HttpContext在控制器的构造函数中几乎为null 。在每个动作中都吸引用户是不好的。我想一次获取用户信息并设置为ViewData;


public DashboardController()

{

    var user = HttpContext.User.GetUserId();

}


查看完整描述

3 回答

?
泛舟湖上清波郎朗

User.FindFirst(ClaimTypes.NameIdentifier).Value

编辑构造函数


下面的代码有效:


public Controller(IHttpContextAccessor httpContextAccessor)

{

    var userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value 

}

编辑RTM


您应该注册IHttpContextAccessor:


    public void ConfigureServices(IServiceCollection services)

    {

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    }


查看完整回答
反对 2020-02-01
?
智慧大石

简单的方法有效,我检查了一下。


private readonly UserManager<IdentityUser> _userManager;

public CompetitionsController(UserManager<IdentityUser> userManager)

{

    _userManager = userManager;

}


var user = await _userManager.GetUserAsync(HttpContext.User);

那么您就可以像这样的变量的所有属性user.Email。我希望这会对某人有所帮助。


编辑:


这显然很简单,但是导致ASP.NET Core中不同类型的身份验证系统的原因有点复杂。我更新,因为有些人越来越null。


对于JWT身份验证(在ASP.NET Core v3.0.0-preview7上测试):


var email = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;


var user = await _userManager.FindByEmailAsync(email);


查看完整回答
反对 2020-02-01
?
繁花不似锦

还有另一种在Asp.NET Core中吸引当前用户的方法-我想我在这里的某个地方看到了它,所以^^


// Stores UserManager

private readonly UserManager<ApplicationUser> _manager; 


// Inject UserManager using dependency injection.

// Works only if you choose "Individual user accounts" during project creation.

public DemoController(UserManager<ApplicationUser> manager)  

{  

    _manager = manager;  

}


// You can also just take part after return and use it in async methods.

private async Task<ApplicationUser> GetCurrentUser()  

{  

    return await _manager.GetUserAsync(HttpContext.User);  

}  


// Generic demo method.

public async Task DemoMethod()  

{  

    var user = await GetCurrentUser(); 

    string userEmail = user.Email; // Here you gets user email 

    string userId = user.Id;

}  

该代码将转到名为DemoController的控制器。没有两个等待就不会工作(不会编译);)


查看完整回答
反对 2020-02-01

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信