如何在不使用Asp.Net Core 2.0中的声明的情况下获取有关已登录用户的信息

时间:2017-11-01 12:04:18

标签: authentication asp.net-core-2.0

我需要当前登录用户的角色和电子邮件等信息,但由于帐户的详细信息可能会在记录时发生变化,因此我被告知不要使用声明。所以基本上我每次需要关于用户的东西时都需要在数据库中搜索。我怎么能实现这样的事情?我考虑过在某处存储ID并根据它查找信息,但我认为有一些“冷静”的方式。

2 个答案:

答案 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)

您可以使用声明来获取有关用户的信息,即使该信息可能会在以后更新。

您所做的就是:在保存用户更新信息后,您只需再次登录并再次登录。声明将使用新信息进行更新。

例如:

  1. 用户访问“我的帐户”页面。

  2. 用户修改其信息&然后点击保存按钮。

  3. 保存用户信息后,在控制器中
  4. ,您只需再次登录。

  5. 这是我目前正在处理的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();
        }