ASP.NET MVC:获取当前登录用户的用户 ID
ASP.NET MVC: Get user id of currently logged in user
我是 ASP.NET MVC 的新手,正在尝试创建一个网络应用程序。
我遇到的问题是,在控制器中 class 我需要获取当前用户的 UserID,但我很困惑如何做到这一点。
此外,似乎用户在登录后未通过身份验证,因为如果我使用 [Authorize] 注释,它会抛出 HTTP Error 401.0 - Unauthorized
错误。
这是我的 Authentication.cs class:
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 工作正常并且 returns 数据输入,但 UserID 为空。 data table "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();
}
在 MVC 5 中有两种获取当前用户的简单方法。
如果你在controller里面class,可以按如下方式获取当前用户,
string userId = User.Identity.GetUserId();
不要忘记添加命名空间:
using Microsoft.AspNet.Identity;
其他情况可能是您不在控制器内 class 并且想要获取用户信息。您可以使用 HttpContext
class.
获取它
HttpContext.Current.User.Identity.GetUserId();
按照以下 link 解决了问题:howto get the user id from a FormsAuthentication page in asp.net MVC? posted by https://whosebug.com/users/2516718/derloopkat
System.Web.HttpContext.Current.User.Identity.Name
函数 returns 身份验证票证中的“名称”属性,在我的例子中是电子邮件地址。然后我通过查询用户数据库获得了用户 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;
我是 ASP.NET MVC 的新手,正在尝试创建一个网络应用程序。
我遇到的问题是,在控制器中 class 我需要获取当前用户的 UserID,但我很困惑如何做到这一点。
此外,似乎用户在登录后未通过身份验证,因为如果我使用 [Authorize] 注释,它会抛出 HTTP Error 401.0 - Unauthorized
错误。
这是我的 Authentication.cs class:
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 工作正常并且 returns 数据输入,但 UserID 为空。 data table "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();
}
在 MVC 5 中有两种获取当前用户的简单方法。
如果你在controller里面class,可以按如下方式获取当前用户,
string userId = User.Identity.GetUserId();
不要忘记添加命名空间:
using Microsoft.AspNet.Identity;
其他情况可能是您不在控制器内 class 并且想要获取用户信息。您可以使用 HttpContext
class.
HttpContext.Current.User.Identity.GetUserId();
按照以下 link 解决了问题:howto get the user id from a FormsAuthentication page in asp.net MVC? posted by https://whosebug.com/users/2516718/derloopkat
System.Web.HttpContext.Current.User.Identity.Name
函数 returns 身份验证票证中的“名称”属性,在我的例子中是电子邮件地址。然后我通过查询用户数据库获得了用户 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;