Asp.net mvc 5 mvc5&;ASP.NET标识-实现混乱

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保存在解决

我正在创建一个新的web应用程序,它将使用MVC5实体框架数据库优先方法编写。我还想使用ASP.Net身份来管理会员资格、身份验证、授权等

我已经读了很多关于ASP.Net在web上的身份以及它是如何工作的,但是,我仍然在学习这个主题

当我在Visual Studio 2013中创建我的MVC 5应用程序并查看帐户控制器时,我的第一反应是我不喜欢我看到的内容,即DbContext被引用为“ApplicationDbContext”。我不喜欢这样做的原因是,我更喜欢将DbContext保存在解决方案中适当的项目中,即,在遵循关注点分离逻辑的模型层中

另外,开箱即用的MVC5项目首先使用实体框架代码创建默认数据库和表来存储用户、角色等

因为我必须将现有数据库与现有用户表一起使用,所以这种方法不适合我的需要

我仍然希望在我的应用程序中使用最新的ASP.Net标识,因为它看起来有很多好处,因此,我发现这篇文章剥离了很多实体框架代码,但仍然将OWIN支持的身份验证应用到ASP.Net MVC中

使用上面的教程,这里是我的帐户控制器的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应用程序中,我通常使用自己的自定义成员身份,当用户登录到该站点并通过身份验证时,我会将任何其他用户详细信息(如用户ID、DOB等)存储在FormsAuthenticationTicket的用户数据字符串中

由于上面的代码不使用表单身份验证,而是使用OWIN Cookie身份验证,因此我不确定如何存储这些额外的用户数据

因此,我对我所遇到的问题有一些疑问

  • 我如何像以前在FormsAuthentication中那样存储用户ID或任何其他用户数据(DOB等)?这是通过向标识添加声明来实现的吗

  • 考虑到我首先使用实体框架数据库和现有数据库,上面使用ASP.Net Identity/OWIN的方法似乎正确吗

  • 我是否应该使用帐户控制器中使用的开箱即用代码,即UserManager、ApplicationUser、ApplicationDbContext等,并将其与现有数据库连接起来

  • 如果我的问题令人困惑,我很抱歉,我想我只是有点不确定在我最近的项目中尝试使用ASP.Net标识时应该使用什么方法

    如有任何反馈,将不胜感激

    谢谢。

    1)新的Katana Cookie中间件支持声明。这就是为什么它比forms auth cookie更好的原因;声明对任何密钥/值对进行建模,这些密钥/值对可以存储在身份验证cookie中。有关更多详细信息,请参阅本文:

    2和3)就身份数据的存储而言,如果需要使用现有表,则可能无法使用Microsoft提供的EF类。相反,您可以自行实现IUserStore和应用程序所需的所有其他商店界面。我不确定是否值得更改已用于存储用户数据的内容


    请记住,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