您好,登录后才能下订单哦!
在现代 Web 应用程序中,用户管理是一个至关重要的功能。无论是电子商务网站、社交媒体平台还是企业内部系统,用户管理都是不可或缺的一部分。ASP.NET MVC 提供了一个强大的身份验证和授权框架——ASP.NET Identity,它可以帮助开发者轻松地实现用户管理功能。
本文将详细介绍如何在 ASP.NET MVC 项目中使用 Identity 实现用户的增删改查(CRUD)操作。我们将从项目设置开始,逐步实现用户注册、登录、管理等功能,并探讨如何通过角色和权限来控制用户的访问权限。
ASP.NET Identity 是一个用于处理用户身份验证和授权的框架。它提供了一套完整的 API,用于管理用户、角色、声明、登录、注销等功能。ASP.NET Identity 支持多种存储后端,包括 SQL Server、MySQL、NoSQL 数据库等。
ASP.NET Identity 的主要特点包括:
在开始之前,我们需要创建一个新的 ASP.NET MVC 项目。以下是创建项目的步骤:
创建项目后,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; }
}
}
在这个例子中,我们添加了 FirstName
、LastName
和 DateOfBirth
三个属性。
接下来,我们需要配置 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
对象
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。