黑狐家游戏

netcore单点登录,net jwt单点登录

欧气 4 0

标题:基于.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 令牌,在单点登录系统的设计中,我们需要考虑用户登录、令牌分发、应用系统验证和用户授权等环节,通过合理的设计和实现,可以提高系统的安全性和用户体验。

标签: #单点登录 #JWT #身份验证

黑狐家游戏
  • 评论列表

留言评论