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

发布时间 - 2025-12-29 00:00:00    点击率:
ASP.NET Core Identity 是构建安全用户管理系统的强大框架,支持注册、登录、角色与声明授权。1. 安装 Microsoft.AspNetCore.Identity.EntityFrameworkCore 等包;2. 可选继承 IdentityUser 创建自定义用户类如 AppUser;3. 创建继承 IdentityDbContext 的 DbContext;4. 在 Program.cs 中注册服务:AddDbContext、AddIdentity、AddAuthentication、AddAuthorization;5. 可使用 AddRazorPages 并运行 aspnet-codegenerator identity 生成 UI 页面;6. 手动登录需注入 SignInManager 调用 PasswordSignInAsync;7. 创建角色如 Admin 并通过 UserManager 分配用户;8. 使用 [Authorize(Roles = "Admin")] 控制访问;9. 添加自定义声明如 CanEdit;10. 定义策略 RequireClaim("CanEdit", "true") 并通过 [Authorize(Policy = "CanEditPolicy")] 使用。结合角色、声明与策略可构建灵活权限体系,适合企业级应用。

在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 虽有一定学习成本,但其集成度高、扩展性强,是企业级项目中的可靠选择。


# word  # app  # ai  # microsoft  # nas  # sqlserver  # 用户注册  # 登录注册  # .net  # red  # 中间件  # String  # if  # 继承  # class  # public  # var  # default  # ui  # 自定义  # 管理系统  # 身份验证  # 可选  # 是一个  # 也可  # 等功能  # 但其  # 虽有 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Python文件流缓冲机制_IO性能解析【教程】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何快速重置建站主机并恢复默认配置?  北京企业网站设计制作公司,北京铁路集团官方网站?  Bootstrap整体框架之JavaScript插件架构  如何基于云服务器快速搭建个人网站?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  网页设计与网站制作内容,怎样注册网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何在Tomcat中配置并部署网站项目?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何用AWS免费套餐快速搭建高效网站?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  北京专业网站制作设计师招聘,北京白云观官方网站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  EditPlus 正则表达式 实战(3)  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  网站制作企业,网站的banner和导航栏是指什么?  详解Oracle修改字段类型方法总结  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  大连 网站制作,大连天途有线官网?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  图册素材网站设计制作软件,图册的导出方式有几种?  常州企业网站制作公司,全国继续教育网怎么登录?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何自定义错误页面(404, 500)?(代码示例)  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  香港服务器租用费用高吗?如何避免常见误区?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Python并发异常传播_错误处理解析【教程】  浅谈redis在项目中的应用  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议