我正在使用C#MVC处理一个简单的Web应用程序。它是登录页面。当我尝试登录系统时,有一个公共登录功能,它获取用户名&密码。
就是这样:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var db = new Entities2();
var user = db.DEV001_Users.FirstOrDefault(u =>
u.Username == model.Username &&
u.Password == model.Password);
if (user != null)
{
FormsAuthentication.SetAuthCookie(user.DEV001_Users_Id.ToString(),
model.RememberMe);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
另一方面,我有另一个名为HomeController的控制器,它获取用户数据库数据(姓名,电子邮件,姓氏等):
var db = new Entities2();
var Username = User.Identity.Name;
var users = db.DEV001_Users.Where(u => u.EmailAddress.ToLower() == Username.ToLower());
var UserModel = new DEV001_Users();
if (users != null)
{
var user = users.First();
UserModel.EmailAddress = user.EmailAddress;
UserModel.GivenName = user.GivenName;
UserModel.Surname = user.Surname;
}
return View(UserModel);
现在,问题是,当我想通过User.Identity.Name获取UserName时,它会给我该记录的ID,而不是用户名。我不知道还能做什么。
答案 0 :(得分:3)
您正在获取ID而不是名称,因为您要在身份验证Cookie中添加ID而不是名称:
FormsAuthentication.SetAuthCookie(user.DEV001_Users_Id.ToString(), model.RememberMe);
您在Cookie中设置的值是User.Identity.Name
中的内容。
答案 1 :(得分:1)
当然,当你访问不同的字段时,你会在这两个函数中得到不同的结果:第一个,user.DEV001_Users_Id
可能是一个整数,第二个user.EmailAddress
和其他字段。
事情就是这样:你已经拥有了model.Username
中的用户名。您实际上是在向FirstOrDefault提供的where
子句中查询它,因此我们知道model.Username
是此DEV001_Users
行中的用户名。
因此,一旦您确认用户存在于数据库中并执行了您可能正在执行的任何其他检查(例如检查它们未被禁止),您就可以将代码修改为以下内容:
FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe);
顺便说一句,我不太喜欢你用明文存储密码的含义。