目录
鉴权基础概念
鉴权与授权的区别
鉴权在.NET Core 中的核心地位
常见鉴权方式
Cookie 鉴权
工作原理
实现步骤
JWT 鉴权
工作原理
实现步骤
OAuth2 鉴权
工作原理
实现步骤(以 Google 登录为例)
实际应用场景与选择策略
不同场景下的鉴权技术应用
鉴权技术选择策略
总结
特性 | 鉴权(Authentication) | 授权(Authorization) |
---|---|---|
目的 | 验证用户身份(“你是谁?”) | 控制资源访问(“你能做什么?”) |
实现方式 | Cookie、JWT、OAuth等 | 角色、声明、策略、自定义规则 |
执行阶段 | 在授权之前(中间件管道早期) | 在鉴权之后(中间件管道后期) |
示例 | 用户登录后获取Token | 检查用户是否有权限访问管理后台 |
鉴权(Authentication),其核心任务是确认用户的身份。例如,当用户输入用户名和密码登录系统时,系统通过验证这些凭据来判断用户是否是其所声称的那个人。而授权(Authorization)则是在鉴权通过后,决定该用户能够访问哪些资源以及执行哪些操作。简单来说,鉴权回答的是 “你是谁” 的问题,授权回答的是 “你能做什么” 的问题。鉴权是授权的前提,只有先确定了用户身份,才能进一步判断其权限。
在 .NET Core 框架中,鉴权是保障应用安全的基石。它通过一系列的机制和组件,确保只有经过身份验证的用户可以访问受保护的资源。从用户登录到后续对各种 API 端点或页面的访问,鉴权贯穿整个应用的交互流程。例如,在一个企业级的 Web 应用中,员工需要登录系统才能查看和处理业务数据,鉴权机制确保了只有合法的员工账号能够登录,并且不同岗位的员工根据其角色被授予不同的数据访问权限。
Cookie 鉴权是一种较为传统且常用的鉴权方式。当用户登录成功后,服务器会生成一个包含用户身份信息的 Cookie,并将其发送到客户端浏览器。客户端在后续的请求中,会自动将这个 Cookie 包含在请求头中发送回服务器。服务器通过验证 Cookie 的有效性和其中携带的用户信息,来确认用户的身份。例如,一个电商网站在用户登录后,会在用户浏览器中设置一个 Cookie,用户在浏览商品、添加购物车等后续操作时,网站服务器通过检查该 Cookie 来识别用户,提供个性化的服务。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Account/AccessDenied";
});
这里设置了登录路径和访问被拒绝时的路径。
var claims = new[] { new System.Security.Claims.Claim(ClaimTypes.Name, user.Username) };
var identity = new System.Security.Claims.ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new System.Security.Claims.ClaimsPrincipal(identity);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
[Authorize]
public IActionResult SecretPage()
{
return View();
}
JWT(JSON Web Token)鉴权是一种基于令牌的鉴权方式,在现代 Web 开发中广泛应用。JWT 是一个包含用户身份和权限信息的 JSON 对象,经过签名后生成一个加密的令牌。用户登录成功后,服务器将这个令牌返回给客户端。客户端在后续的请求中,将令牌放在请求头(通常是 Authorization 头)中发送给服务器。服务器通过验证令牌的签名和有效性,来确认用户的身份和权限。由于 JWT 是自包含的,服务器无需在服务端存储用户的会话状态,这使得它非常适合用于分布式和无状态的应用架构。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]))
};
});
这些配置信息通常存储在 appsettings.json 文件中。
public string GenerateJwtToken(User user)
{
var claims = new[]
{
new System.Security.Claims.Claim(ClaimTypes.Name, user.Username),
new System.Security.Claims.Claim(ClaimTypes.Role, user.Role)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: Configuration["Jwt:Issuer"],
audience: Configuration["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
[Authorize]
[ApiController]
[Route("[controller]")]
public class SecretDataController : ControllerBase
{
[HttpGet]
public IActionResult GetSecretData()
{
return Ok("This is secret data only accessible to authenticated users.");
}
}
OAuth2 是一种广泛应用的授权框架,主要用于第三方应用获取用户在另一个服务上的资源访问权限,而无需直接获取用户的凭据。其核心流程涉及到资源拥有者(用户)、客户端应用、授权服务器和资源服务器。例如,当用户使用微信账号登录一个第三方应用时,第三方应用向微信的授权服务器请求授权,用户在微信的授权页面确认授权后,授权服务器会向第三方应用颁发一个授权码或访问令牌。第三方应用使用这个令牌可以访问用户在微信上的部分资源(如基本信息、朋友圈等),具体的访问权限由用户在授权时决定。
services.AddAuthentication()
.AddGoogle(options =>
{
options.ClientId = Configuration["Google:ClientId"];
options.ClientSecret = Configuration["Google:ClientSecret"];
});
鉴权技术在.NET Core 开发中扮演着举足轻重的角色,是保障应用安全的核心环节。通过本文对 Cookie 鉴权、JWT 鉴权和 OAuth2 鉴权等常见鉴权方式的详细介绍,以及对实际应用场景和选择策略的分析,希望能够帮助开发者在不同的项目需求下,准确选择和实施合适的鉴权方案。