Asp.net mvc 5 mvc5&;ASP.NET标识-实现混乱
我正在创建一个新的web应用程序,它将使用MVC5和实体框架数据库优先方法编写。我还想使用ASP.Net身份来管理会员资格、身份验证、授权等 我已经读了很多关于ASP.Net在web上的身份以及它是如何工作的,但是,我仍然在学习这个主题 当我在Visual Studio 2013中创建我的MVC 5应用程序并查看帐户控制器时,我的第一反应是我不喜欢我看到的内容,即DbContext被引用为“ApplicationDbContext”。我不喜欢这样做的原因是,我更喜欢将DbContext保存在解决方案中适当的项目中,即,在遵循关注点分离逻辑的模型层中 另外,开箱即用的MVC5项目首先使用实体框架代码创建默认数据库和表来存储用户、角色等 因为我必须将现有数据库与现有用户表一起使用,所以这种方法不适合我的需要 我仍然希望在我的应用程序中使用最新的ASP.Net标识,因为它看起来有很多好处,因此,我发现这篇文章剥离了很多实体框架代码,但仍然将OWIN支持的身份验证应用到ASP.Net MVC中 使用上面的教程,这里是我的帐户控制器的HttpPost登录方法Asp.net mvc 5 mvc5&;ASP.NET标识-实现混乱,asp.net-mvc-5,asp.net-identity,owin,Asp.net Mvc 5,Asp.net Identity,Owin,我正在创建一个新的web应用程序,它将使用MVC5和实体框架数据库优先方法编写。我还想使用ASP.Net身份来管理会员资格、身份验证、授权等 我已经读了很多关于ASP.Net在web上的身份以及它是如何工作的,但是,我仍然在学习这个主题 当我在Visual Studio 2013中创建我的MVC 5应用程序并查看帐户控制器时,我的第一反应是我不喜欢我看到的内容,即DbContext被引用为“ApplicationDbContext”。我不喜欢这样做的原因是,我更喜欢将DbContext保存在解决
[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应用程序中,我通常使用自己的自定义成员身份,当用户登录到该站点并通过身份验证时,我会将任何其他用户详细信息(如用户ID、DOB等)存储在FormsAuthenticationTicket的用户数据字符串中
由于上面的代码不使用表单身份验证,而是使用OWIN Cookie身份验证,因此我不确定如何存储这些额外的用户数据
因此,我对我所遇到的问题有一些疑问
请记住,OWIN/Katana部分与标识存储是分开的 这是解决方案 为了加快速度,您可以将示例应用添加到项目中,并从修改示例应用开始,示例应用包括确认电子邮件、密码恢复、角色管理员和用户角色管理等。位于: 请在此处查看示例应用程序的完整详细信息: 使用以下属性控制对控制器或操作的访问
[Authorize] //Anyone with authorization
[Authorize(Roles="Administrator")] //Admin role only
通过检查用户是否处于角色中
HttpContext.User.IsInRole("Administrator")
UserManager.IsInRole(userID, "Administrator")
通过以下方式获取配置文件数据:
// Create manager
var manager = new UserManager<ApplicationUser>(
new UserStore<ApplicationUser>(new ApplicationDbContext()))
// Find user
var user = manager.FindById(User.Identity.GetUserId());
var profileProperty_1 = user.profileProperty_1
//创建管理器
var-manager=newusermanager(
新的用户存储(新的ApplicationDbContext())
//查找用户
var user=manager.FindById(user.Identity.GetUserId());
var profileProperty_1=user.profileProperty_1
谢谢Brock,您关于OWIN身份验证的文章非常有用。要将userID存储为声明,我可以执行类似claims.Add的操作(newclaims(ClaimTypes.userID,“2”);我能请你看看这个问题吗?我试图添加到我的身份中的声明似乎没有正确添加。谢谢@tgriffiths是的,在发布cookie时添加任何您想要的声明。谢谢Brock。你能看一看,并可能提供一个答案,这个问题,这是完全相同的问题,我正在经历?谢谢。您好,现有控制器中的Authorize属性会继续工作吗?您好@tgriffiths我和您的情况一样。。你能帮我看看你在用什么方法吗
// Create manager
var manager = new UserManager<ApplicationUser>(
new UserStore<ApplicationUser>(new ApplicationDbContext()))
// Find user
var user = manager.FindById(User.Identity.GetUserId());
var profileProperty_1 = user.profileProperty_1