ASP.NET MVC:获取当前登录用户的用户ID

3

我是ASP.NET MVC的新手,正在尝试创建一个Web应用程序。

我的问题在于,在控制器类中,我需要获取当前用户的UserID,但是我对如何实现这一点非常困惑。 此外,似乎用户在登录后未经身份验证,因为如果我使用[Authorize]注释,它会抛出HTTP错误401.0 - 未经授权的错误。

这是我的Authentication.cs类:

public static class Authentication
{
    public static bool CreateNewTicket(User user, bool rememberMe)
    {

        try
        {
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                1,
                user.Email,
                DateTime.Now,
                DateTime.Now.AddDays(5),
                rememberMe,
                user.ID.ToString(),
                FormsAuthentication.FormsCookiePath
                );

            string encryptedTicket = FormsAuthentication.Encrypt(ticket);

            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            cookie.HttpOnly = true;
            if (!HttpContext.Current.Request.IsLocal)
                cookie.Secure = true;

            HttpContext.Current.Response.Cookies.Add(cookie);

            return true;
        }
        catch
        {
            return false;
        }
    }
    public static bool AuthUser(string Email, string Password)
    {
        using (var db = new AntContext())
        {
            string password = Password;
            string email = Email;

            string hashedPW = GetHash(password);

            bool userValid = db.Users.Any(user => user.Email == email && user.Password == hashedPW);

            if (userValid)
            {
                var actUser = db.Users.FirstOrDefault(u => u.Email == Email && u.Password == hashedPW);

                if (!actUser.IsLocked)
                {
                    if (CreateNewTicket(actUser, false))
                    {

                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else if (actUser.IsLocked)
                {



                }
            }
            return false;

        }
    }

问题实际上发生在我尝试将数据存储到数据库中时。

[HttpPost]
    public ActionResult Q_FirstPage(ViewModels.Q1_Answer_VM vm)
    {
        vm.Qst = new Models.Questionnaire();
        vm.Qst.NumericAnswers = new List<Models.NumericAnswer>();
        vm.Qst.TextAnswers = new List<Models.TextAnswer>();
        vm.Qst.IsComplete = false;
        vm.Qst.StartedOn = DateTime.Now;
        vm.Qst.NumericAnswers.Add(vm.Breite);
        vm.Qst.NumericAnswers.Add(vm.Tiefe);
        vm.Qst.NumericAnswers.Add(vm.Hoehe);
        vm.Qst.TextAnswers.Add(vm.Sonstiges);

        //vm.qst.User_ID = 22; if I set the User ID manually, it works

        db.Questionnaires.Add(vm.Qst);
        db.SaveChanges();

        return View();
    }

Viewmodel可以正常工作并返回输入的数据,但UserID为空。数据表“Questionnaire”使用UserID作为外键,当它到达savedata()部分时会抛出错误,因为我猜它期望正确的UserID。因此,我想我需要获取当前的UserID,将其传递给实例化的对象,然后传递给数据上下文,并保存到数据库中。
不幸的是,我发现很难找到关于ASP.NET用户身份验证工作方式的完整信息。
如果您需要更多信息,请告诉我。
这是我的登录方法:
 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(Login_VM login_vm)
    {
        if (!ModelState.IsValid)
        {
            return View(login_vm);
        }

        if (Authentication.AuthUser(login_vm.Email, login_vm.Password) == true && (login_vm.Email != null || login_vm.Password != null))
        {

            Classes.Authentication.CreateNewTicket(login_vm.usr, true);
            return RedirectToAction("Login");
        }

        else
            return View("~/Views/Home/Index.cshtml");
    }

这是我的注册方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddUser(User model)
// add new User to db
{

    if (ModelState.IsValid)
    {
        User usr = new Models.User();
        usr = model;
        model.Password = Authentication.GetHash(model.Password);
        db.Users.Add(model);
        db.SaveChanges();
    }
    return View();
}

您是否正在使用asp.net身份管理系统? - Masoud Andalibi
我正在使用表单身份验证。 - mneumann
你在项目中使用了这个示例吗? - SᴇM
你的 Login 动作 Get 方法在哪里?(return RedirectToAction("Login");, 你应该在那里为你的用户授权) - SᴇM
@SeM 我正在使用之前有人创建的现有代码库,所以我不知道。我会看一下它。此外,我实际上不知道重定向是如何工作的。它重定向到“登录”视图,实际上是登录后的页面...就像我说的,我觉得这有点令人困惑。它应该重定向到哪里? - mneumann
2个回答

4
通过以下链接解决了这个问题:如何从 asp.net MVC FormsAuthentication 页面中获取用户 ID?,帖子由https://stackoverflow.com/users/2516718/derloopkat发布。

System.Web.HttpContext.Current.User.Identity.Name函数返回身份验证票证中的“name”属性,而在我的情况下它是电子邮件地址。然后通过查询用户数据库来获取用户ID。

db.Users.Where(x => x.Email == System.Web.HttpContext.Current.User.Identity.Name).FirstOrDefault().ID;

感谢大家的帮助。


2020 年更新:查询可以简化为:

db.Users.FirstOrDefault(x => x.Email == System.Web.HttpContext.Current.User.Identity.Name).ID;


1
添加命名空间 using Microsoft.AspNet.Identity 并获取 ID User.Identity.GetUserId() - sairfan
这仅在使用身份验证时有效,而我没有使用。 - mneumann

-1

在MVC 5中获取当前用户有两种简单的方法。

如果你正在控制器类中,可以按如下方式获取当前用户:

string userId = User.Identity.GetUserId();

不要忘记添加命名空间:

using Microsoft.AspNet.Identity;

另一种情况可能是您不在控制器类内部,但想要获取用户信息。您可以使用 HttpContext 类来获取。

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

谢谢。Identity.GetUserId()使用哪个命名空间?顺便说一下,我正在使用表单身份验证。 - mneumann
2
@mneumann,这不正确,因为您没有使用身份管理系统。 - Masoud Andalibi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接