我需要当前登录用户的角色和电子邮件等信息,但由于帐户的详细信息可能会在记录时发生变化,因此我被告知不要使用声明。所以基本上我每次需要关于用户的东西时都需要在数据库中搜索。我怎么能实现这样的事情?我考虑过在某处存储ID并根据它查找信息,但我认为有一些“冷静”的方式。
答案 0 :(得分:1)
使用页面的User
属性。它有一个名为Identity
的内部属性,其中包含当前登录用户的用户名。还有一个名为GetUserId()
的扩展方法,可以帮助您查找当前登录用户的用户ID。
拥有用户ID,您可以参考数据库并找到有关该用户的更多信息。
考虑以下可以轻松提取当前用户ID的代码:
public static string ValidateAndGetUserId(IIdentity identity)
{
if (identity == null)
throw new ApplicationException("No User is logged in");
var userId = identity.GetUserId();
if (string.IsNullOrWhiteSpace(userId))
throw new ApplicationException("No User is logged in");
return userId;
}
答案 1 :(得分:1)
您可以使用声明来获取有关用户的信息,即使该信息可能会在以后更新。
您所做的就是:在保存用户更新信息后,您只需再次登录并再次登录。声明将使用新信息进行更新。
例如:
用户访问“我的帐户”页面。
用户修改其信息&然后点击保存按钮。
,您只需再次登录。
这是我目前正在处理的MVC 5应用程序的一个示例,但这个想法应该仍适用于asp.net核心:
// POST: MyAccount
[Authorize(Roles = "Admin,Host,User")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyAccount([Bind(Include = "FirstName,LastName,Email,Phone,Country,State,TimeZone")] MyAccountVM vm)
{
var id = User.Identity.GetUserId();
if (ModelState.IsValid)
{
var user = await UserManager.FindByIdAsync(id);
if (user == null)
{
return HttpNotFound();
}
user.FirstName = vm.FirstName;
user.LastName = vm.LastName;
user.Email = vm.Email;
user.UserName = vm.Email;
user.Phone = vm.Phone;
user.Country = vm.Country;
user.State = vm.State;
user.TimeZone = vm.TimeZone;
var result = await UserManager.UpdateAsync(user);
if (result.Succeeded)
{
var currentUser = await UserManager.FindByIdAsync(user.Id);
if (currentUser != null)
{
await SignInManager.SignInAsync(currentUser, isPersistent: false, rememberBrowser: false);
}
TempData["saved"] = "true";
return RedirectToAction("MyAccount");
}
}
return View();
}