在ASP.NET Core中实现身份验证与授权:使用.NET Identity框架

来源:这里教程网 时间:2026-02-21 17:36:01 作者:

在ASP.NET Core中实现身份验证与授权,.NET Identity 是一个强大且灵活的框架,能够帮助开发者快速构建安全的用户管理系统。它内置了用户注册、登录、密码管理、角色控制和声明授权等功能,适合大多数需要用户认证的Web应用。

配置 ASP.NET Core Identity

.NET Identity 通常基于 Entity Framework Core 实现数据持久化,支持自定义用户模型和存储结构。

1. 安装必要包

Microsoft.AspNetCore.Identity.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.AspNetCore.Identity.UI

2. 创建自定义用户类(可选)

若需扩展默认用户属性(如电话、昵称),可继承 IdentityUser

public class AppUser : IdentityUser
{
public string Nickname { get; set; }
}

3. 配置 DbContext

创建上下文类继承 IdentityDbContext

public class AppDbContext : IdentityDbContext
{
public AppDbContext(DbContextOptions options) : base(options) { }
}

4. 在 Program.cs 中注册服务

builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

builder.Services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();

// 启用身份验证中间件
builder.Services.AddAuthentication();
builder.Services.AddAuthorization();

启用身份验证与登录流程

Identity 提供了内置的 UI 页面处理登录注册,也可手动实现逻辑。

使用内置 UI(快速开发)

// 在 Program.cs 添加
builder.Services.AddRazorPages().AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizePage("/Account/Login");
});

app.MapRazorPages();

运行 dotnet aspnet-codegenerator identity -dc AppDbContext 可生成 UI 页面用于定制。

手动实现登录逻辑

在控制器中注入 SignInManagerUserManager

[HttpPost]
public async Task Login(LoginModel model)
{
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(
model.Email, model.Password, model.RememberMe, false);
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("", "无效登录尝试");
}
return View(model);
}

实现基于角色的授权

Identity 支持角色管理,可用于控制访问权限。

创建并分配角色

var roleManager = serviceProvider.GetRequiredService>();
if (!await roleManager.RoleExistsAsync("Admin"))
{
await roleManager.CreateAsync(new IdentityRole("Admin"));
}

var userManager = serviceProvider.GetRequiredService>();
var user = await userManager.FindByNameAsync("admin@site.com");
await userManager.AddToRoleAsync(user, "Admin");

在控制器或页面中使用 [Authorize]

[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
// 只有 Admin 角色可访问
}

使用声明(Claims)进行细粒度授权

声明代表用户的详细信息或权限,比角色更灵活。

为用户添加自定义声明

await _userManager.AddClaimAsync(user, new Claim("CanEdit", "true"));

定义策略并使用

// 在 Program.cs 中注册策略
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("CanEditPolicy", policy =>
policy.RequireClaim("CanEdit", "true"));
});

使用策略:

[Authorize(Policy = "CanEditPolicy")]
public IActionResult Edit() => View();

基本上就这些。通过结合角色、声明和策略,可以构建出层次清晰、易于维护的权限体系。ASP.NET Core Identity 虽有一定学习成本,但其集成度高、扩展性强,是企业级项目中的可靠选择。

相关推荐