如何获取当前登录用户的用户对象

时间:2014-09-28 21:50:18

标签: asp.net-mvc-5 asp.net-identity

在控制器中获取当前登录用户的身份用户对象(来自身份框架)的正确方法是什么?

我需要针对用户更新一些属性(表AspNetUsers),并且不知道获取用户对象的正确方法,以便我可以执行以下操作:

  var menuItem = context.MenuItems.First(m => m.Description == "New Order");
  var user = ??????????
  user.MenuItems.Add(menuItem);
  context.SaveChanges();

我通过添加一些属性并重命名该类来稍微修改原始用户模型:

public class User : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }
    public virtual ICollection<MenuItem> MenuItems { get; set; }
}

那么如何从控制器中检索这个User对象?

2 个答案:

答案 0 :(得分:3)

在控制器类中使用命名空间 Microsoft.AspNet.Identity 并获取当前用户:

var user = User.Identity;

示例:

using Microsoft.AspNet.Identity;
...
public class FooController : Controller
{
    [Authorize]
    public ActionResult Index()
    {
        var user = User.Identity;
        ...
        return View();
    }
}

<强>被修改

获取个人资料信息: This link提供了向用户添加个人资料信息的步骤。

要检索您的用户数据,您应该:

  1. 获取当前登录的UserId,以便您可以查看用户 ASP.NET身份系统
  2.   

    var currentUserId = User.Identity.GetUserId();

    1. 在ASP.Identity系统中实例化UserManager,以便查看 系统中的用户
    2.   

      var manager = new UserManager(new UserStore(new MyDbContext()));

      1. 获取用户对象
      2.   

        var currentUser = manager.FindById(User.Identity.GetUserId());

        1. 获取有关用户的个人资料信息
        2.   

          currentUser.MyUserInfo.FirstName

答案 1 :(得分:0)

获取用户名

var userName = User.Identity.Name;

Get the user using static method created below.

var user = GetCurrentUser(userName);

获取用户的静态方法

            public static User GetCurrentUser(string userName)
            {
                var userManager = new UserManager<User>(new UserStore<User>(new YourIdentityDbContext()));
                var user = userManager.FindByName(userName);
                return user;
            }