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


159
  • 如何获取MVC 5中当前登录用户的ID ?我尝试了StackOverflow建议,但似乎不适用于MVC 5。
  • 另外,将素材分配给用户的MVC 5最佳实践是什么?(例如,User应该有Items,我应该存储在用户IdItem?我可以扩展User与类List<Item>导航属性?

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

尝试了这些:

'Membership.GetUser()'为空。


添加了我尝试过的内容的参考。最后一个在MVC4中可以,但在MVC5中不可以。我还需要一些“使用用户”的最佳实践:)
Adam Szabo

当您说您正在使用MVC 5时,您在使用什么作为会员资格?OWin.Security?
阿隆(Aron)2013年

MVC模板中的“个人用户帐户”。
亚当·萨博

3
HttpContext.Current.User.Identity.Name是当前登录用户的名称。
2013年

1
如何获得ID?我想将当前用户分配给Item他创建的用户,但不基于用户名(可能会更改)。它无法正常工作`HttpContext.Current'System.Web.HttpContextBase'不包含'Current'的定义,也找不到扩展方法'Current'接受类型为'System.Web.HttpContextBase'的第一个参数(您是否缺少using指令或程序集引用?)`。您确定您的解决方案适用于MVC 5吗?
亚当·萨博

Answers:


313

如果您在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。

尚无最佳实践,但发现了一些有关扩展用户个人资料的有价值的信息:


9
ASP.NET MVC 5的用户身份验证和授权已更改。现在,它是基于声明的身份验证,其中包含可与EF或其他提供程序一起使用的接口和通用存储库(默认情况下是EF实现)。由于GetUserId是扩展方法,存储在的底部Ass_Start\IdentityConfig.cs,因此您需要在任何地方使用它,如果在不同的名称空间中,则必须设置,using Microsoft.AspNet.Identity以使扩展可见。
Anderson Matos 2013年

1
survey.UserId = Guid.Parse(User.Identity.GetUserId());
NicoJuicy

如果我添加使用参考,用户是否仍带有红色下划线?为什么会这样呢?
Zapnologica 2014年

@Zapnologica:尝试重建项目,也许VS IntelliSense有点慢。
亚当·萨博

5
注意用户仅在Controller msdn.microsoft.com/zh-cn/library/中可用(@Zapnologica您是否在控制器外部使用它?请尝试HttpContext.Current.User.Identity.GetUserId();)
可能在

28

尝试类似的方法:

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

与RTM一起使用。


11
它强加了不必要的数据库行程。
Arash

3
@Arash,应用程序应该如何在不联系数据库的情况下获取用户的对象?
fabspro 2014年

2
@Arash没关系,我明白你的意思了。可以使用User.Identity.GetUserId()检索ID。没有任何数据库行程。
fabspro 2014年

记住要使用mvc5(成员2):User.Identity.GetUserId()与表[AspNetUsers]中的ID不同。因此,雅各布·阿诺德(Jakub Arnold)和罗克(Rok)是正确的方式

我对答案有点困惑。我在控制器上下文中似乎不存在UserStore类型。有任何想法吗?
Jhourlad Estrella

19

如果要在一行代码中使用ApplicationUser对象(如果安装了最新的ASP.NET Identity),请尝试:

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

您将需要以下using语句:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

找不到<ApplicationUserManager>的对象
Fandango68 '18

7

取得ID非常简单,您已经解决了。

不过,您的第二个问题涉及更多。

因此,这些都是目前的预发行版本,但是您面临的常见问题是要使用新属性(或您所质疑的Items集合)扩展用户。

开箱即用,您会得到一个IdentityModel位于Models文件夹下的文件(在撰写本文时)。在那儿有几节课。ApplicationUserApplicationDbContext。要添加您的收藏集,Items您将需要修改ApplicationUser类,就像您在实体框架中使用的是普通类一样。实际上,如果您快速浏览一下,您会发现所有与身份相关的类(用户,角色等)现在都是带有适当数据注释的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

高温超导


我不认为有什么像预发布文档那样的东西吗?
德里克·托姆斯

@Derek Tomes-不是我碰到过。我认为我们必须等到11月13日才能获得真正的文档。老实说,这不是很好,甚至在uservoice上还要求提供更好的指导-aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…–
AugyOne Unite,

好的,但是我如何获得类型的实例AccountController
嵌套

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;
        }
    }
    ...
}

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;

请不要仅仅发布代码,尤其是不要没有任何评论。如果您解释您的代码,它将更有帮助。
阿里·卡纳特

0

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

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

您还将需要以下内容:

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.Owin;


0

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

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

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

在视图页面中只需调用

ViewBag.userId 

运行项目,您将可以看到您的userId

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.