User
应该Items
。我应该将用户的Id
存储在Item
吗?我可以使用User
扩展List<Item>
课程吗?导航属性?我正在使用MVC模板中的“个人用户帐户”。
试过这些:
'Membership.GetUser()'为空。
答案 0 :(得分:300)
如果您在ASP.NET MVC控制器中进行编码,请使用
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
值得一提的是,User.Identity.IsAuthenticated
和User.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
的文件(在撰写本文时)。在那里你有几个班级; ApplicationUser
和ApplicationDbContext
。要添加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