在C#的Web应用开发中,Identity是微软官方提供的身份管理框架,能够帮助我们快速实现用户注册、登录、密码管理、角色权限分配等核心身份相关功能,避免重复开发基础安全模块。它内置了完善的安全机制,支持密码哈希存储、登录失败锁定、双因素认证等特性,非常适合各类需要用户体系的应用场景。

Identity基础环境搭建
我们首先在ASP.NET Core项目中集成Identity框架,需要先安装对应的NuGet包,然后配置服务和数据上下文。
安装依赖包
通过NuGet安装以下两个核心包:
- Microsoft.AspNetCore.Identity.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.SqlServer
配置身份服务
在Program.cs中添加Identity服务和数据库上下文配置,示例代码如下:
// 配置数据库上下文,使用SqlServer数据库
builder.Services.AddDbContext<AppIdentityDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
// 添加Identity服务,指定用户类型和角色类型
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<AppIdentityDbContext>()
.AddDefaultTokenProviders();
// 配置Identity相关选项
builder.Services.Configure<IdentityOptions>(options =>
{
// 密码规则配置
options.Password.RequireDigit = true;
options.Password.RequiredLength = 6;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequireLowercase = false;
// 登录配置
options.SignIn.RequireConfirmedAccount = false;
});
// 添加身份验证中间件
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Account/AccessDenied";
});
其中AppIdentityDbContext需要继承IdentityDbContext,代码如下:
public class AppIdentityDbContext : IdentityDbContext<IdentityUser>
{
public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options)
: base(options)
{
}
}
用户注册功能实现
用户注册是身份管理的基础功能,我们需要创建对应的控制器和视图,处理用户提交的注册信息。
注册控制器方法
在AccountController中添加注册相关的Action:
public class AccountController : Controller
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly UserManager<IdentityUser> _userManager;
public AccountController(SignInManager<IdentityUser> signInManager, UserManager<IdentityUser> userManager)
{
_signInManager = signInManager;
_userManager = userManager;
}
[HttpGet]
public IActionResult Register()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
// 创建用户对象
var user = new IdentityUser
{
UserName = model.Email,
Email = model.Email
};
// 创建用户,密码会自动哈希存储
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);
}
}
注册视图模型
对应的RegisterViewModel定义如下:
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 = "两次输入的密码不一致")]
public string ConfirmPassword { get; set; }
}
用户登录与退出功能
登录功能需要验证用户输入的账号密码是否匹配,退出功能则清除用户的登录状态。
登录功能实现
[HttpGet]
public IActionResult Login()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
// 验证用户密码
var result = await _signInManager.PasswordSignInAsync(
model.Email,
model.Password,
model.RememberMe,
lockoutOnFailure: false);
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError(string.Empty, "账号或密码错误");
}
}
return View(model);
}
退出功能实现
[HttpPost]
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction("Index", "Home");
}
角色权限管理
Identity支持角色管理,我们可以创建不同角色,给用户分配角色,再基于角色控制接口的访问权限。
创建角色
可以通过代码初始化角色,也可以在管理页面中动态创建:
// 在Program.cs中添加角色初始化代码
using (var scope = app.Services.CreateScope())
{
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
string[] roles = { "Admin", "User", "Guest" };
foreach (var role in roles)
{
if (!await roleManager.RoleExistsAsync(role))
{
await roleManager.CreateAsync(new IdentityRole(role));
}
}
}
给用户分配角色
// 给用户分配Admin角色
var user = await _userManager.FindByEmailAsync("test@ipipp.com");
if (user != null)
{
await _userManager.AddToRoleAsync(user, "Admin");
}
基于角色的权限控制
在控制器或Action上添加Authorize特性即可限制访问:
// 只有Admin角色的用户可以访问
[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
public IActionResult Dashboard()
{
return View();
}
}
// 登录用户即可访问,无需特定角色
[Authorize]
public class UserController : Controller
{
public IActionResult Profile()
{
return View();
}
}
常见问题与优化
- 如果用户忘记密码,可以调用
UserManager.GeneratePasswordResetTokenAsync生成重置令牌,再通过邮件发送重置链接 - 生产环境中建议开启双因素认证,提升账号安全性
- 密码规则可以根据项目需求调整,比如要求包含特殊字符、设置更长的密码长度
- 如果用户量较大,可以考虑将Identity的数据存储替换为Redis等缓存,提升查询性能
Identity用户身份管理C#ASP.NET_Core身份验证修改时间:2026-07-22 04:24:38