我正在创建一个新的 Web 应用程序,使用MVC 5和Entity Framework 数据库优先方法编写。我还想使用ASP.Net Identity管理成员资格、认证、授权等功能。
我已经在网上阅读了关于 ASP.Net Identity 的很多信息以及它的工作原理,但是我仍然在学习这个主题。
当我在 Visual Studio 2013 中创建我的 MVC 5 应用程序并查看Account Controller时,我的第一反应是我不喜欢我所看到的,即引用了名为“ApplicationDbContext”的DbContext。我不喜欢这个的原因是因为我想把我的 DbContext 保留在适当的项目中,也就是我的模型层,在那里它遵循关注点分离逻辑。
此外,默认情况下,MVC 5 项目会使用 Entity Framework Code First 来创建数据库和表,以存储用户、角色等信息。
由于我必须使用现有的数据库和现有的用户表,这种方法不适合我的需求。
尽管如此,我仍然想在我的应用程序中使用最新的 ASP.Net Identity,因为它看起来有很多好处。因此,我发现了这篇文章,剥离了很多 Entity Framework 代码,但仍然将 OWIN 动力认证引入了 ASP.NET MVC 中。
http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown-part-deux
使用上述教程,这是我的Account Controller中的HttpPost 登录方法:
[HttpPost]
[AllowAnonymous]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
//Calling my own custom Account Service which validates users login details
var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
if (user)
{
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
//ToDo: Manually adding Role, but will pull from db later
identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
AuthenticationManager.SignIn(new AuthenticationProperties
{
IsPersistent = model.RememberMe
}, identity);
return RedirectToAction("Index", "MyDashboard");
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
return View(model);
}
在我之前的MVC应用程序中,我通常会自己编写自定义成员资格。当用户登录站点并通过身份验证时,我会将任何附加用户详细信息(例如userID,DOB等)存储在FormsAuthenticationTicket的UserData字符串中。由于上面的代码未使用FormsAuthentication,而是使用OWIN CookieAuthentication,因此我不确定如何存储此附加用户数据。
因此,我有几个关于我遇到问题的问题。
1. 我该如何存储userID或任何其他附加的用户数据(如DOB等),就像以前在FormsAuthentication中所做的那样?这是否通过向身份添加声明来完成? 2. 考虑到我正在使用现有数据库的Entity Framework Database First,上述使用ASP.Net Identity/ OWIN的方法是否正确? 3. 我应该使用Account Controller中使用的开箱即用的代码,例如UserManager,ApplicationUser,ApplicationDbContext等,并将其连接起来以与我的现有数据库一起使用吗?
如果我的问题很困惑,我很抱歉,我想我只是有点不确定我应该在尝试在我的最新项目中使用ASP.Net Identity时采取什么方法。
非常感谢您的任何反馈。