首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET核心标识-获取当前用户

ASP.NET核心标识-获取当前用户
EN

Stack Overflow用户
提问于 2016-08-04 02:57:33
回答 7查看 189.3K关注 0票数 108

要在MVC5中获取当前登录的用户,我们所要做的就是:

代码语言:javascript
复制
using Microsoft.AspNet.Identity;
[Authorize]
public IHttpActionResult DoSomething() {
    string currentUserId = User.Identity.GetUserId();
}

现在,对于ASP.NET核心,我认为这应该可以工作,但它抛出了一个错误。

代码语言:javascript
复制
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Http;

private readonly UserManager<ApplicationUser> _userManager;
[HttpPost]
[Authorize]
public async Task<IActionResult> StartSession() {
    var curUser = await _userManager.GetUserAsync(HttpContext.User);
}

有什么想法吗?

编辑:Gerardo的响应正在进行中,但是为了获得用户的实际"Id“,这似乎是可行的:

代码语言:javascript
复制
ClaimsPrincipal currentUser = this.User;
var currentUserID = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-08-04 03:11:12

如果您的代码是MVC控制器中的

代码语言:javascript
复制
public class MyController : Microsoft.AspNetCore.Mvc.Controller

Controller基类中,可以从User属性中获取ClaimsPrincipal

代码语言:javascript
复制
System.Security.Claims.ClaimsPrincipal currentUser = this.User;

您可以直接检查索赔(无需往返到数据库):

代码语言:javascript
复制
bool isAdmin = currentUser.IsInRole("Admin");
var id = _userManager.GetUserId(User); // Get user id:

其他字段可以从数据库的用户实体中获取:

  1. 使用依赖注入获取用户管理器

私有UserManager _userManager;//类构造函数公共MyController(UserManager userManager) { _userManager = userManager;}

  1. 并使用它:

var _userManager.GetUserAsync=等待电子邮件(用户);var电子邮件= user.Email;

如果您的代码是一个服务类,那么您可以使用依赖项注入来获取一个IHttpContextAccessor,该User允许您从HttpContext中获取该a。

代码语言:javascript
复制
    private IHttpContextAccessor _httpContextAccessor;

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

    private void DoSomething()
    {
        var user = _httpContextAccessor.Context?.User;
    }
票数 168
EN

Stack Overflow用户

发布于 2018-02-03 04:53:08

如果您使用的是轴承令牌身份验证,则以上示例不会返回应用程序用户。

取而代之的是,使用这个:

代码语言:javascript
复制
ClaimsPrincipal currentUser = this.User;
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
ApplicationUser user = await _userManager.FindByNameAsync(currentUserName);

这在apsnetcore 2.0中有效。在早期版本中没有尝试过。

票数 39
EN

Stack Overflow用户

发布于 2018-05-12 04:15:29

对于上下文,我使用ASP.NET Core2Web应用程序模板创建了一个项目。然后,选择Web应用程序(MVC),然后单击Change Authentication按钮并选择单个用户帐户。

这个模板为您构建了大量的基础设施。在控制器文件夹中找到ManageController

ManageController类构造函数需要填充此UserManager变量:

代码语言:javascript
复制
private readonly UserManager<ApplicationUser> _userManager;

然后,看看这个类中的HttpPost索引方法。它们以这种方式获取当前用户:

代码语言:javascript
复制
var user = await _userManager.GetUserAsync(User);

作为额外的说明,这是您想要将任何自定义字段更新到已添加到AspNetUsers表中的用户配置文件的地方。将字段添加到视图中,然后将这些值提交给IndexViewModel,然后将其提交给此Post方法。我在默认逻辑之后添加了以下代码来设置电子邮件地址和电话号码:

代码语言:javascript
复制
user.FirstName = model.FirstName;
user.LastName = model.LastName;
user.Address1 = model.Address1;
user.Address2 = model.Address2;
user.City = model.City;
user.State = model.State;
user.Zip = model.Zip;
user.Company = model.Company;
user.Country = model.Country;
user.SetDisplayName();
user.SetProfileID();

_dbContext.Attach(user).State = EntityState.Modified;
_dbContext.SaveChanges();
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38751616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档