导读:本期聚焦于小伙伴创作的《C#中如何实现Identity身份管理?C#用户身份管理实战教程》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#中如何实现Identity身份管理?C#用户身份管理实战教程》有用,将其分享出去将是对创作者最好的鼓励。

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

C#中如何实现Identity身份管理?C#用户身份管理实战教程

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。