ASP.NET MVC如何使用Identity增删改查用户

发布时间:2022-10-24 09:57:43 作者:iii
来源:亿速云 阅读:161

ASP.NET MVC 如何使用 Identity 增删改查用户

目录

  1. 引言
  2. ASP.NET Identity 简介
  3. 项目设置
  4. 创建用户模型
  5. 配置 Identity
  6. 用户注册
  7. 用户登录
  8. 用户管理
  9. 角色管理
  10. 权限控制
  11. 总结

引言

在现代 Web 应用程序中,用户管理是一个至关重要的功能。无论是电子商务网站、社交媒体平台还是企业内部系统,用户管理都是不可或缺的一部分。ASP.NET MVC 提供了一个强大的身份验证和授权框架——ASP.NET Identity,它可以帮助开发者轻松地实现用户管理功能。

本文将详细介绍如何在 ASP.NET MVC 项目中使用 Identity 实现用户的增删改查(CRUD)操作。我们将从项目设置开始,逐步实现用户注册、登录、管理等功能,并探讨如何通过角色和权限来控制用户的访问权限。

ASP.NET Identity 简介

ASP.NET Identity 是一个用于处理用户身份验证和授权的框架。它提供了一套完整的 API,用于管理用户、角色、声明、登录、注销等功能。ASP.NET Identity 支持多种存储后端,包括 SQL Server、MySQLNoSQL 数据库等。

ASP.NET Identity 的主要特点包括:

项目设置

在开始之前,我们需要创建一个新的 ASP.NET MVC 项目。以下是创建项目的步骤:

  1. 打开 Visual Studio。
  2. 选择“创建新项目”。
  3. 选择“ASP.NET Web 应用程序(.NET Framework)”。
  4. 输入项目名称,例如“IdentityDemo”。
  5. 选择“MVC”模板,并确保选中“身份验证”为“个人用户账户”。
  6. 点击“创建”按钮。

创建项目后,Visual Studio 会自动生成一些与 Identity 相关的代码和配置文件。我们将在接下来的步骤中逐步完善这些代码。

创建用户模型

ASP.NET Identity 默认使用 ApplicationUser 类来表示用户。我们可以通过继承 IdentityUser 类来扩展用户模型,添加自定义属性。

Models 文件夹中,找到 ApplicationUser.cs 文件,并添加一些自定义属性:

using Microsoft.AspNetCore.Identity;

namespace IdentityDemo.Models
{
    public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime DateOfBirth { get; set; }
    }
}

在这个例子中,我们添加了 FirstNameLastNameDateOfBirth 三个属性。

配置 Identity

接下来,我们需要配置 Identity 以使用我们自定义的用户模型。打开 Startup.cs 文件,找到 ConfigureServices 方法,并修改如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddControllersWithViews();
    services.AddRazorPages();
}

在这个配置中,我们指定了 ApplicationUser 作为用户模型,并配置了 Identity 使用 Entity Framework Core 来存储数据。

用户注册

用户注册是用户管理的第一步。我们将创建一个注册页面,允许用户输入他们的信息并创建账户。

创建注册视图

Views/Account 文件夹中,找到 Register.cshtml 文件,并修改如下:

@model IdentityDemo.Models.RegisterViewModel

<h2>Register</h2>

<form asp-action="Register" method="post">
    <div asp-validation-summary="All" class="text-danger"></div>

    <div class="form-group">
        <label asp-for="Email"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="Password"></label>
        <input asp-for="Password" class="form-control" />
        <span asp-validation-for="Password" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="ConfirmPassword"></label>
        <input asp-for="ConfirmPassword" class="form-control" />
        <span asp-validation-for="ConfirmPassword" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="FirstName"></label>
        <input asp-for="FirstName" class="form-control" />
        <span asp-validation-for="FirstName" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="LastName"></label>
        <input asp-for="LastName" class="form-control" />
        <span asp-validation-for="LastName" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="DateOfBirth"></label>
        <input asp-for="DateOfBirth" class="form-control" />
        <span asp-validation-for="DateOfBirth" class="text-danger"></span>
    </div>

    <button type="submit" class="btn btn-primary">Register</button>
</form>

创建注册视图模型

Models 文件夹中,创建一个新的类 RegisterViewModel

using System;
using System.ComponentModel.DataAnnotations;

namespace IdentityDemo.Models
{
    public class RegisterViewModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }

        [Required]
        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }

        [Required]
        [DataType(DataType.Date)]
        public DateTime DateOfBirth { get; set; }
    }
}

实现注册逻辑

Controllers/AccountController.cs 文件中,找到 Register 方法,并修改如下:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser
        {
            UserName = model.Email,
            Email = model.Email,
            FirstName = model.FirstName,
            LastName = model.LastName,
            DateOfBirth = model.DateOfBirth
        };

        var result = await _userManager.CreateAsync(user, model.Password);

        if (result.Succeeded)
        {
            await _signInManager.SignInAsync(user, isPersistent: false);
            return RedirectToAction("Index", "Home");
        }

        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    return View(model);
}

在这个方法中,我们首先检查模型是否有效。如果有效,我们创建一个新的 ApplicationUser 对象,并使用 UserManager 将其保存到数据库中。如果用户创建成功,我们将用户登录并重定向到主页。

用户登录

用户登录是用户管理的另一个重要功能。我们将创建一个登录页面,允许用户输入他们的凭据并登录到系统。

创建登录视图

Views/Account 文件夹中,找到 Login.cshtml 文件,并修改如下:

@model IdentityDemo.Models.LoginViewModel

<h2>Login</h2>

<form asp-action="Login" method="post">
    <div asp-validation-summary="All" class="text-danger"></div>

    <div class="form-group">
        <label asp-for="Email"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="Password"></label>
        <input asp-for="Password" class="form-control" />
        <span asp-validation-for="Password" class="text-danger"></span>
    </div>

    <div class="form-group">
        <div class="checkbox">
            <label asp-for="RememberMe">
                <input asp-for="RememberMe" />
                @Html.DisplayNameFor(m => m.RememberMe)
            </label>
        </div>
    </div>

    <button type="submit" class="btn btn-primary">Login</button>
</form>

创建登录视图模型

Models 文件夹中,创建一个新的类 LoginViewModel

using System.ComponentModel.DataAnnotations;

namespace IdentityDemo.Models
{
    public class LoginViewModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Display(Name = "Remember me?")]
        public bool RememberMe { get; set; }
    }
}

实现登录逻辑

Controllers/AccountController.cs 文件中,找到 Login 方法,并修改如下:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);

        if (result.Succeeded)
        {
            return RedirectToLocal(returnUrl);
        }

        ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    }

    return View(model);
}

在这个方法中,我们首先检查模型是否有效。如果有效,我们使用 SignInManager 尝试登录用户。如果登录成功,我们将用户重定向到指定的 URL 或主页。

用户管理

用户管理功能允许管理员查看、编辑和删除用户。我们将创建一个用户管理页面,显示所有用户的列表,并提供编辑和删除选项。

查看用户列表

首先,我们需要创建一个视图来显示用户列表。

创建用户列表视图

Views/Admin 文件夹中,创建一个新的视图 Index.cshtml

@model IEnumerable<IdentityDemo.Models.ApplicationUser>

<h2>User Management</h2>

<table class="table">
    <thead>
        <tr>
            <th>Email</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Date of Birth</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var user in Model)
        {
            <tr>
                <td>@user.Email</td>
                <td>@user.FirstName</td>
                <td>@user.LastName</td>
                <td>@user.DateOfBirth.ToShortDateString()</td>
                <td>
                    <a asp-action="Edit" asp-route-id="@user.Id">Edit</a> |
                    <a asp-action="Delete" asp-route-id="@user.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

实现用户列表逻辑

Controllers/AdminController.cs 文件中,创建一个新的控制器 AdminController,并添加以下代码:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using IdentityDemo.Models;

namespace IdentityDemo.Controllers
{
    [Authorize(Roles = "Admin")]
    public class AdminController : Controller
    {
        private readonly UserManager<ApplicationUser> _userManager;

        public AdminController(UserManager<ApplicationUser> userManager)
        {
            _userManager = userManager;
        }

        public async Task<IActionResult> Index()
        {
            var users = _userManager.Users;
            return View(users);
        }
    }
}

在这个控制器中,我们使用 UserManager 获取所有用户,并将其传递给视图。

编辑用户信息

接下来,我们将实现编辑用户信息的功能。

创建编辑视图

Views/Admin 文件夹中,创建一个新的视图 Edit.cshtml

@model IdentityDemo.Models.ApplicationUser

<h2>Edit User</h2>

<form asp-action="Edit" method="post">
    <div asp-validation-summary="All" class="text-danger"></div>

    <input type="hidden" asp-for="Id" />

    <div class="form-group">
        <label asp-for="Email"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="FirstName"></label>
        <input asp-for="FirstName" class="form-control" />
        <span asp-validation-for="FirstName" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="LastName"></label>
        <input asp-for="LastName" class="form-control" />
        <span asp-validation-for="LastName" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="DateOfBirth"></label>
        <input asp-for="DateOfBirth" class="form-control" />
        <span asp-validation-for="DateOfBirth" class="text-danger"></span>
    </div>

    <button type="submit" class="btn btn-primary">Save</button>
</form>

实现编辑逻辑

Controllers/AdminController.cs 文件中,添加以下代码:

[HttpGet]
public async Task<IActionResult> Edit(string id)
{
    var user = await _userManager.FindByIdAsync(id);
    if (user == null)
    {
        return NotFound();
    }

    return View(user);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(ApplicationUser model)
{
    if (ModelState.IsValid)
    {
        var user = await _userManager.FindByIdAsync(model.Id);
        if (user == null)
        {
            return NotFound();
        }

        user.Email = model.Email;
        user.UserName = model.Email;
        user.FirstName = model.FirstName;
        user.LastName = model.LastName;
        user.DateOfBirth = model.DateOfBirth;

        var result = await _userManager.UpdateAsync(user);

        if (result.Succeeded)
        {
            return RedirectToAction("Index");
        }

        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    return View(model);
}

在这个方法中,我们首先根据用户 ID 查找用户。如果找到用户,我们将其信息更新为模型中的数据,并保存更改。

删除用户

最后,我们将实现删除用户的功能。

实现删除逻辑

Controllers/AdminController.cs 文件中,添加以下代码:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(string id)
{
    var user = await _userManager.FindByIdAsync(id);
    if (user == null)
    {
        return NotFound();
    }

    var result = await _userManager.DeleteAsync(user);

    if (result.Succeeded)
    {
        return RedirectToAction("Index");
    }

    foreach (var error in result.Errors)
    {
        ModelState.AddModelError(string.Empty, error.Description);
    }

    return View("Index", _userManager.Users);
}

在这个方法中,我们首先根据用户 ID 查找用户。如果找到用户,我们将其从数据库中删除。

角色管理

角色管理是用户管理的一个重要组成部分。通过角色,我们可以将用户分组,并为每个组分配不同的权限。

创建角色

首先,我们需要创建一个角色管理页面,允许管理员创建新角色。

创建角色视图

Views/Admin 文件夹中,创建一个新的视图 CreateRole.cshtml

@model IdentityDemo.Models.CreateRoleViewModel

<h2>Create Role</h2>

<form asp-action="CreateRole" method="post">
    <div asp-validation-summary="All" class="text-danger"></div>

    <div class="form-group">
        <label asp-for="RoleName"></label>
        <input asp-for="RoleName" class="form-control" />
        <span asp-validation-for="RoleName" class="text-danger"></span>
    </div>

    <button type="submit" class="btn btn-primary">Create</button>
</form>

创建角色视图模型

Models 文件夹中,创建一个新的类 CreateRoleViewModel

using System.ComponentModel.DataAnnotations;

namespace IdentityDemo.Models
{
    public class CreateRoleViewModel
    {
        [Required]
        [Display(Name = "Role Name")]
        public string RoleName { get; set; }
    }
}

实现创建角色逻辑

Controllers/AdminController.cs 文件中,添加以下代码:

[HttpGet]
public IActionResult CreateRole()
{
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreateRole(CreateRoleViewModel model)
{
    if (ModelState.IsValid)
    {
        var role = new IdentityRole
        {
            Name = model.RoleName
        };

        var result = await _roleManager.CreateAsync(role);

        if (result.Succeeded)
        {
            return RedirectToAction("Index");
        }

        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    return View(model);
}

在这个方法中,我们首先检查模型是否有效。如果有效,我们创建一个新的 IdentityRole 对象

推荐阅读:
  1. asp.net MVC下如何使用rest
  2. ASP.NET MVC如何使用Bootstrap

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

asp.net mvc identity

上一篇:vue遍历中存在el-form问题怎么解决

下一篇:SpringBoot常用计量与bean属性校验和进制数据转换规则是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》