如何获取当前用户,以及如何在MVC5中使用User类?

时间:2013-08-26 16:25:32

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

  • 如何在 MVC 5 中获取当前登录用户的ID?我尝试了StackOverflow建议,但它们似乎不适用于MVC 5.
  • 此外,为用户分配内容的MVC 5最佳做法是什么? (例如,User应该Items。我应该将用户的Id存储在Item吗?我可以使用User扩展List<Item>课程吗?导航属性?

我正在使用MVC模板中的“个人用户帐户”。

试过这些:

  

'Membership.GetUser()'为空。

9 个答案:

答案 0 :(得分:300)

如果您在ASP.NET MVC控制器中进行编码,请使用

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

值得一提的是,User.Identity.IsAuthenticatedUser.Identity.Name可以在不添加上述using声明的情况下发挥作用。但没有它,GetUserId()将不存在。

如果您在控制器以外的课程中,请使用

HttpContext.Current.User.Identity.GetUserId();

在MVC 5的默认模板中,用户ID是存储为字符串的GUID。

还没有最佳做法,但找到了有关扩展用户个人资料的一些有价值的信息:

答案 1 :(得分:28)

尝试类似:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

适用于RTM。

答案 2 :(得分:18)

如果您希望将ApplicationUser对象放在一行代码中(如果您安装了最新的ASP.NET标识),请尝试:

int

您需要使用以下语句:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

答案 3 :(得分:7)

获取ID非常简单,你已经解决了这个问题。

你的第二个问题涉及更多。

所以,现在这是所有预发布的东西,但是您面临的常见问题是您使用新属性扩展用户(或者您的问题中的Items集合)。

开箱即用,你会在Models文件夹下找到一个名为IdentityModel的文件(在撰写本文时)。在那里你有几个班级; ApplicationUserApplicationDbContext。要添加Items的集合,您需要修改ApplicationUser类,就像您使用Entity Framework时的正常类一样。事实上,如果你快速浏览一下,你会发现所有与身份相关的类(用户,角色等......)现在都只是POCO,并带有相应的数据注释,因此它们与EF6相得益彰。

接下来,您需要对AccountController构造函数进行一些更改,以便它知道使用您的DbContext。

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

现在为您登录的用户获取整个用户对象是坦率的,说实话。

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

该行将完成工作,您将能够按照自己的意愿访问userWithItems.Items

HTH

答案 4 :(得分:0)

我感觉到你的痛苦,我正在尝试做同样的事情。就我而言,我只想清除用户。

我已经创建了一个基本控制器类,我的所有控制器都继承自该类。我在其中覆盖了OnAuthentication并设置了filterContext.HttpContext.User to null

这是我迄今为止所做的最好的......

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}

答案 5 :(得分:0)

        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;

答案 6 :(得分:0)

如果其他人有这种情况: 我正在创建电子邮件验证程序以登录我的应用程序,因此我的用户尚未登录,但是我使用以下方法检查了登录名中输入的电子邮件,这是@firecape解决方案的一种变体

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

您还将需要以下内容:

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.Owin;

答案 7 :(得分:0)

在.Net MVC5核心2.2中,我使用HttpContext.User.Identity.Name。它对我有用。

答案 8 :(得分:0)

这是我获取AspNetUser ID并将其显示在主页上的方式

我在HomeController Index()方法中放置了以下代码

ViewBag.userId = User.Identity.GetUserId();

在视图页面中只需调用

ViewBag.userId 

运行项目,您将能够看到您的userId