标题:基于.Net Core 的 JWT 单点登录实现
一、引言
在当今的企业应用架构中,单点登录(Single Sign-On,SSO)成为了提高用户体验和管理用户身份的重要解决方案,它允许用户只需一次登录,就可以访问多个相互信任的应用系统,而无需在每个系统中重复输入用户名和密码。.Net Core 作为一个现代化的、开源的、跨平台的开发框架,提供了丰富的工具和技术来实现 SSO 功能,JSON Web Token(JWT)是一种常用的用于在 Web 应用中表示用户身份的轻量级令牌格式,本文将介绍如何使用.Net Core 实现基于 JWT 的单点登录系统。
二、JWT 简介
JWT 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式来表示声明信息,这些声明信息可以被数字签名以确保其真实性和完整性,JWT 由三部分组成:头部(Header)、负载(Payload)和签名(Signature),头部包含令牌的类型(JWT)和使用的签名算法,负载包含有关用户身份和其他相关信息的声明,签名是使用密钥对负载进行签名的结果,用于验证令牌的完整性和真实性。
三、.Net Core 中的 JWT 实现
在.Net Core 中,可以使用第三方库来实现 JWT 的生成和验证,一个流行的库是 System.IdentityModel.Tokens.Jwt,以下是一个使用 System.IdentityModel.Tokens.Jwt 库生成 JWT 令牌的示例代码:
using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; class Program { static void Main() { // 定义密钥 string key = "mysecretkey"; // 定义声明 ClaimsIdentity claimsIdentity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "John Doe"), new Claim(ClaimTypes.Email, "johndoe@example.com") }); // 创建令牌描述符 SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor { Subject = claimsIdentity, Expires = DateTime.Now.AddMinutes(30), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)), SecurityAlgorithms.HmacSha256Signature) }; // 创建 JWT 令牌处理器 JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); // 生成 JWT 令牌 SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); // 序列化令牌为字符串 string jwtToken = tokenHandler.WriteToken(token); Console.WriteLine("Generated JWT Token: " + jwtToken); } }
上述代码首先定义了一个密钥,然后创建了一个包含用户声明的 ClaimsIdentity 对象,创建了一个 SecurityTokenDescriptor 对象,其中包含了令牌的主体、过期时间和签名凭据,创建了一个 JwtSecurityTokenHandler 对象,并使用它来生成 JWT 令牌,将令牌序列化为字符串并输出到控制台。
四、单点登录系统的设计与实现
单点登录系统的设计通常包括以下几个步骤:
1、用户登录:用户在身份验证服务器上输入用户名和密码进行登录。
2、身份验证:身份验证服务器验证用户的身份,并生成一个 JWT 令牌。
3、令牌分发:身份验证服务器将生成的 JWT 令牌分发到各个应用系统。
4、应用系统验证:应用系统在用户访问时,验证用户携带的 JWT 令牌的有效性。
5、用户授权:如果令牌有效,应用系统根据用户的权限进行授权操作。
以下是一个基于.Net Core 的单点登录系统的示例代码:
using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using System.Web.Http; [RoutePrefix("api")] public class AccountController : ApiController { // 定义密钥 string key = "mysecretkey"; // 登录方法 [HttpPost] [Route("login")] public IHttpActionResult Login([FromBody] LoginModel model) { // 模拟用户登录验证 if (model.Username == "admin" && model.Password == "password") { // 定义声明 ClaimsIdentity claimsIdentity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.Username), new Claim(ClaimTypes.Email, model.Username + "@example.com") }); // 创建令牌描述符 SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor { Subject = claimsIdentity, Expires = DateTime.Now.AddMinutes(30), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)), SecurityAlgorithms.HmacSha256Signature) }; // 创建 JWT 令牌处理器 JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); // 生成 JWT 令牌 SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); // 序列化令牌为字符串 string jwtToken = tokenHandler.WriteToken(token); return Ok(new { Token = jwtToken }); } else { return Unauthorized(); } } // 授权方法 [HttpGet] [Route("authorized")] public IHttpActionResult Authorized() { // 获取令牌 string jwtToken = Request.Headers.Authorization.Parameter; // 验证令牌 if (!ValidateToken(jwtToken)) { return Unauthorized(); } return Ok("Authorized"); } // 验证令牌的有效性 private bool ValidateToken(string jwtToken) { try { // 解析令牌 JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); JwtSecurityToken jwtTokenObj = tokenHandler.ReadToken(jwtToken) as JwtSecurityToken; // 验证签名 tokenHandler.ValidateToken(jwtToken, new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)) }, out SecurityToken validatedToken); return true; } catch { return false; } } } class LoginModel { public string Username { get; set; } public string Password { get; set; } }
上述代码定义了一个 AccountController 控制器,其中包含了登录和授权方法,登录方法接受一个包含用户名和密码的模型,并模拟用户登录验证,如果验证成功,生成一个 JWT 令牌并返回给客户端,授权方法用于验证用户携带的 JWT 令牌的有效性,如果令牌有效,返回 "Authorized" 表示用户已授权。
五、总结
本文介绍了如何使用.Net Core 实现基于 JWT 的单点登录系统,通过使用 System.IdentityModel.Tokens.Jwt 库,我们可以方便地生成和验证 JWT 令牌,在单点登录系统的设计中,我们需要考虑用户登录、令牌分发、应用系统验证和用户授权等环节,通过合理的设计和实现,可以提高系统的安全性和用户体验。
评论列表