65.9K
CodeProject 正在变化。 阅读更多。
Home

在 MVC 项目中使用 Asp.net Identity 进行身份验证和授权

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (19投票s)

2015 年 12 月 22 日

CPOL

6分钟阅读

viewsIcon

73905

downloadIcon

2885

使用 Asp.net Identity 进行身份验证和授权

引言

Asp.net Identity 是一种适用于所有 Asp.net 模板(如 Web Forms、MVC、Web API 等)的新型身份验证方式。它还提供用户和角色管理功能。Asp.net Identity 还允许用户使用其社交网站凭据(如 Facebook、Google 和 Microsoft)登录网站。Asp.net Identity 使用 OWIN 框架生成身份验证 Cookie 和实现社交凭据登录功能。

本文内容列表。

  1. 什么是 Asp.net Identity?
  2. 身份验证和授权图。
  3. Asp.net Identity 和 OWIN。
  4. 示例 MVC 项目和项目描述。

什么是 Asp.net Identity?

Asp.net Identity 是微软提供的一种新的 Asp.net 项目身份验证方式。它是一种所有微软框架(如 Web Forms、MVC、Web API 等)通用的身份验证机制。它还提供系统中的用户和角色管理功能。它使用 OWIN 中间件生成身份验证 Cookie 和提供社交网站的登录凭据功能。Asp.net Identity 需要 VS2015 和 .Net 4.5 才能运行。

身份验证和授权图。

下图显示了身份验证和授权。

简而言之,身份验证是检查用户凭据的过程,即检查用户提供的用户名和密码与系统数据库是否匹配,以允许用户访问系统中的资源。

授权在身份验证之后开始。对所有用户开放的资源可由所有用户访问。但对于受限资源,如果用户尝试访问,系统会检查用户名和密码进行身份验证。如果用户已通过身份验证且有权访问,则系统允许用户访问资源,否则系统会将用户重定向到登录页面。

Asp.Net Identity 和 OWIN。

Asp.Net Identity 使用 OWIN 框架生成用于回发之间验证的身份验证 cookie。OWIN 还提供允许第三方凭据进行身份验证的功能。第三方社交网站包括 Facebook、Gmail 和 Microsoft。

示例 MVC 项目和项目描述。

此 MVC 示例项目演示了使用 Asp.net Identity 进行身份验证,并展示了在 MVC 项目中应用授权的方式。该演示项目是一个学生课程管理系统。学生可以在系统中添加课程并将其分配给自己。这里的学生就是用户。

要运行该项目,请下载并解压 zip 文件。使用 VS2015 打开解决方案文件。运行前请重建项目。它将使用 NuGet 从在线下载必要的包。然后运行项目。

步骤如下。

  1. 首先,通过选择“个人用户账户”身份验证选项来创建一个 MVC 项目。此选项将添加 Asp.Net Identity 和 OWIN 的所有必要包和 DLL。
  2. 由于 Asp.Net Identity 使用 Code First Entity Framework,因此我修改了一些默认代码并添加了一些新的实体模型。我用以下模型替换了 ApplicationUser 模型。
    public class StudentUser : IdentityUser
        {
            public StudentUser()
            {
                Courses = new HashSet<Course>();
            }
            public int RollNo { get; set; }
            public string Address { get; set; }
            public string Sex { get; set; }
            public virtual ICollection<Course> Courses { get; set; }
        }
  3. Course 是一个具有以下属性的新实体模型。
    public class Course
        {
            public Course()
            {
                this.Students = new HashSet<StudentUser>();
            }
            public int Id { get; set; }
            [Required]
            public string Title { get; set; }
            public string Description { get; set; }
            public float Credit { get; set; }
            public virtual ICollection<StudentUser> Students { get; set; }
        } 

    StudentUser 和 Course 模型具有多对多关系。两个模型都包含彼此的集合。
  4. 默认的 ApplicationDbContext 类被以下代码替换。

    	public class StudentCourseManagementDbContext : IdentityDbContext <studentuser>
        {
            public StudentCourseManagementDbContext() : base("StudentCourseManagementCS")
            {
                Configuration.ProxyCreationEnabled = false;
            }
    
            public System.Data.Entity.DbSet<course> Courses { get; set; }
        }
    	

    这里的 IdentityDbContext 是 Asp.net Identity 的内置类,提供了 Entity Framework 的数据访问操作。这里的 StudentCourseManagementCS 是 web.config 文件中声明的连接字符串。这个 Context 类将创建一个新的 Course 表以及 Asp.net Identity 用于用户和角色管理的其他表。
  5. 现在,从“程序包管理器控制台”运行命令“enable-migrations”以启用代码优先迁移。
    它将启用代码优先迁移,并在项目中创建一个包含 Configuration.cs 文件的 Migrations 文件夹。
  6. 现在从 Package Manager Console 运行命令 'add-migration InitialCreate'。
    它将在 Migrations 文件夹中创建一个 .cs 文件,该文件将包含用于创建初始数据库表的代码。
  7. 现在从“程序包管理器控制台”运行命令“Update-Database”,它将执行上面创建的文件并为 Asp.Net Identity 创建表。
  8. 数据库表图如下所示。

    以下是 Asp.net Identity 使用的默认表,除了 Courses 和 StudentUserCourses。StudentUserCourses 用于维护 Courses 和 AspNetUsers 之间的多对多关系。
  9. CourseController 及其操作用于添加、编辑和删除课程,并将其分配给学生。默认的 AccountController 仅用于创建新用户。这里的学生就是用户。
  10. 运行项目后,它将显示以下 UI。
  11. 渲染上述视图所执行的操作是
    public ActionResult Index(string message)
            {
                ViewBag.Message = message;
                return View(db.Courses.ToList());
            }
    

    此操作无需登录即可访问。这里系统不检查身份验证和授权。用户可以访问此操作,因为此操作没有限制。接下来我们将了解如何在操作中应用限制并检查身份验证以进行访问。
  12. 现在,如果用户点击“添加新课程”或“分配给用户”链接,应用程序将重定向您到登录页面,这是因为对所请求的操作应用了访问限制。创建新课程的操作如下所示。
    [Authorize(Users = "Basher")]
            public ActionResult Create()
            {
                return View();
            }
    

    在此操作中,通过添加属性类 Authorize 来应用授权。这里只有名为 Basher 的用户可以访问该操作。因此,要访问此操作,用户需要使用适当的凭据登录。
  13. 点击“分配给用户”后执行的操作如下所示。
        [Authorize]
            public ActionResult Assign()
            {
                /* Code Here */
            }
    

    这里,访问权限授予所有授权用户。要访问此功能,用户必须登录系统。
  14. 新用户的注册页面如下所示。


    创建用户的操作如下所示。
    public async Task<actionresult> Register(RegisterViewModel model)
            {
                if (ModelState.IsValid)
                {
                    var user = new StudentUser() { UserName = model.UserName };
                    var result = await UserManager.CreateAsync(user, model.Password);
                    if (result.Succeeded)
                    {
                        await SignInAsync(user, isPersistent: false);
                        return RedirectToAction("Index", "Home");
                    }
                    else
                    {
                        AddErrors(result);
                    }
                }
                return View(model);
            }
    

    这里使用 UserManager 类来创建一个新用户,该类由 Asp.Net Identity 自动生成。因此,这里使用 Identity 来创建一个用户。你甚至可以使用 Identity 编辑、删除用户并创建角色。
  15. 新课程的 UI。

    这里使用的操作是
        [Authorize]
            public ActionResult Create([Bind(Include="Id,Title,Description,Credit")] Course course)
            {
                if (ModelState.IsValid)
                {
                    db.Courses.Add(course);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(course);
            }
        

    此处使用 Entity Framework DB Context 类 StudentCourseManagementDbContext 来添加新课程。
  16. 将课程分配给学生的 UI。

    这里使用的操作是
        [Authorize]
            public ActionResult Assign(IEnumerable<courseviewmodel> assignVeiwModel)
            {
                var currentUser = userManager.FindById(User.Identity.GetUserId());
                if(currentUser !=null)
                {
                    var user = db.Users.Include("Courses").Where(u => u.Id == currentUser.Id).FirstOrDefault();
                    foreach (CourseViewModel courseVM in assignVeiwModel)
                    {
                        if (courseVM.IsSelected)
                        {
                            Course course = user.Courses.Where(c => c.Id == courseVM.Id).FirstOrDefault();
                            if(course == null)
                            {
                                Course courseAdd = db.Courses.Where(c => c.Id == courseVM.Id).FirstOrDefault();
                                currentUser.Courses.Add(courseAdd);
                            }
                        }
                    }
                    db.SaveChanges();
                }
                return RedirectToAction("AssignedCourses");
            }
    

    这里执行的操作是,首先获取当前用户对象,然后获取当前用户的所有已分配课程,接着查找未分配的课程并显示给用户。这里使用了一个新的 CourseViewModel 类来保存所有未分配的课程。
    CourseViewModel 类的属性是
        public class CourseViewModel
        {
            public int Id { get; set; }
            public string Title { get; set; }
            public string Description { get; set; }
            public float Credit { get; set; }
            public bool IsSelected { get; set; }
        }
        
  17. 最后是显示当前用户已分配课程列表的 UI。

    这里使用的操作是
        [Authorize]
            public ActionResult AssignedCourses()
            {
                var currentUser = userManager.FindById(User.Identity.GetUserId());
                if (currentUser != null)
                {
                    var user = db.Users.Include("Courses").Where(u => u.Id == currentUser.Id).FirstOrDefault();
                    return View(user.Courses);
                }
                return RedirectToAction("Assign");
            }
        

    这里执行的操作是,首先获取当前用户对象,然后获取当前用户已分配的课程并显示它们。

结论

这就是关于在 MVC 项目中使用 Asp.Net Identity 进行身份验证和授权的全部内容。希望这个演示项目能让您清楚地了解如何在 MVC 项目中应用身份验证和授权。总而言之,身份验证允许用户进入系统,而授权则允许和拒绝用户访问系统资源。

 

© . All rights reserved.