AspMvc20实现用户登录与注销功能实例讲解
项目准备与环境配置
在Visual Studio中创建MVC Web Application(选择“Empty”模板),确保项目配置为“Authentication: None”。

- 添加核心引用:在项目中引入
System.Web.Security命名空间(用于FormsAuthentication类)。 - 数据库准备:创建SQL Server数据库(如
LoginDB),设计用户表(Users),结构如下表所示:
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| UserId | INT | 主键,自增 |
| Username | NVARCHAR(50) | 用户名,唯一 |
| PasswordHash | NVARCHAR(256) | 密码哈希值 |
| Role | NVARCHAR(20) | 角色(如User/Admin) |
用户模型设计
模型类定义
创建User模型类,封装用户信息并实现密码加密逻辑,示例代码:
public class User
{
public int UserId { get; set; }
[Required, DataType(DataType.EmailAddress)]
public string Username { get; set; }
[Required, DataType(DataType.Password)]
public string Password { get; set; } // 明文,后续加密
public string PasswordHash { get; set; } // 加密后存储
public string Role { get; set; } = "User";
}
// 密码加密工具类
public static class PasswordHelper
{
public static string HashPassword(string password)
{
using (var sha256 = System.Security.Cryptography.SHA256.Create())
{
byte[] bytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
return Convert.ToBase64String(bytes);
}
}
}数据库设计
使用SQL语句创建Users表并插入测试数据:
CREATE TABLE Users (
UserId INT PRIMARY KEY IDENTITY(1,1),
Username NVARCHAR(50) UNIQUE NOT NULL,
PasswordHash NVARCHAR(256) NOT NULL,
Role NVARCHAR(20) NOT NULL DEFAULT 'User'
);
-- 插入示例数据
INSERT INTO Users (Username, PasswordHash, Role) VALUES
('admin', 'YWRtaW46cGFzc3dvcmQ=', 'Admin'),
('user', 'ZmxhZ3tobWFuZGVy', 'User');用户注册功能实现
控制器逻辑
创建AccountController,实现注册表单处理与数据存储:

public class AccountController : Controller
{
[HttpGet]
public ActionResult Register()
{
return View();
}
[HttpPost]
public ActionResult Register(User model)
{
if (ModelState.IsValid)
{
// 加密密码并存储
model.PasswordHash = PasswordHelper.HashPassword(model.Password);
using (var db = new LoginDBContext())
{
db.Users.Add(model);
db.SaveChanges();
}
// 设置会话
Session["Username"] = model.Username;
return RedirectToAction("Index", "Home");
}
return View(model);
}
}- 视图实现:创建
Register.cshtml,包含用户名、密码、确认密码表单,使用HTML5验证属性(如required、pattern)。
用户登录功能实现
控制器逻辑
在AccountController中添加登录逻辑,验证用户名与密码:
[HttpGet]
public ActionResult Login()
{
return View();
}
[HttpPost]
public ActionResult Login(string username, string password)
{
using (var db = new LoginDBContext())
{
var user = db.Users.FirstOrDefault(u => u.Username == username);
if (user != null && user.PasswordHash == PasswordHelper.HashPassword(password))
{
// 设置Forms Authentication Cookie
FormsAuthentication.SetAuthCookie(username, rememberMe: true);
Session["Username"] = username;
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("", "用户名或密码错误");
}
return View();
}- 视图实现:创建
Login.cshtml,包含用户名、密码表单,提交后处理登录逻辑。
用户注销功能实现
控制器逻辑
实现注销方法,清除会话与Cookie:
[HttpGet]
public ActionResult Logout()
{
FormsAuthentication.SignOut();
Session.Clear();
Session.Abandon();
return RedirectToAction("Login");
}安全性最佳实践
- 密码加密:始终使用强加密算法(如SHA256、BCrypt),避免明文存储密码。
- 防止CSRF攻击:在关键POST请求(如登录、注册)上添加
[ValidateAntiForgeryToken]属性。 - HTTPS部署:生产环境强制使用HTTPS,保护传输中的数据。
- 会话管理:合理设置会话超时时间,避免长时间会话被滥用。
常见问题解答(FAQs)
问题1:如何处理密码加密?
解答:推荐使用BCrypt或SHA256等强加密算法,避免明文存储密码,在模型中实现HashPassword方法,将用户输入的密码加密后存储到数据库。

问题2:注销后用户还能通过Cookie返回吗?
解答:注销时需调用FormsAuthentication.SignOut()并清除会话和Cookie(如Session.Clear()、Session.Abandon()),确保用户无法通过Cookie重新登录。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/200163.html


