编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

C# JWT跨域身份验证算法示例(跨域获取json数据)

wxchong 2024-08-12 02:19:33 开源技术 37 ℃ 0 评论

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆场景,JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,该token也可直接被用于认证,也可被加密。

一、JWT的组成

下面是JWT的一段示例,分为三个部分,分别是头部(header),载荷(payload)}和签证(signature)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5aSn6IOcIiwicGFzc3dvcmQiOiIxMjM0NTY3ODkiLCJ0eXBlIjoiVklQIn0.PLAL76P20cCKo66zLrnW6VXU6wsg3GhJsFcqDoXTEbk

1.头部 (header)

{
    'alg': "HS256",
    'typ': "JWT"
}

2.载荷(payload)

{
    "sub": '1234567890',
    "name": 'john',
    "admin":true
}

3.签名算法 HS256(signature)

Token= HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

4.结果 (头部+载荷+Token )三个部分组成

 base64UrlEncode(header) + "." + base64UrlEncode(payload)+"."+Token

二、在C#中如何实现JWT算法

1.准备JWT.dll 和 Json.dll库,并将其引入C#项目中

2.开始码砖块 key密钥不可泄漏,签名验证算法就没用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JWT;
using Newtonsoft.Json;

namespace ConsoleApp_jwt
{
    class Program
    {
        static void Main(string[] args)
        {
						//加密
            UUdata u = new UUdata() { name = "大胜", password = "123456789", type = "VIP" };

            string token = new AA().GetToken(u);
            Console.WriteLine("加密token:"+token);
          //解密
            UUdata w = new AA().GetUU(token);
            Console.WriteLine();

            Console.WriteLine("解密后数据:{0}-{1}-{2}",w.name,w.password,w.type);
            Console.Read();


        }
    }
//JWT 加解密类
    class AA
    {
        //密钥
        private string key = "dsaskhja";
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="u">需要加密字符串</param>
        /// <returns></returns>
        public string GetToken(UUdata u)
        {

            JWT.Algorithms.IJwtAlgorithm Algorithm = new JWT.Algorithms.HMACSHA256Algorithm();

            JWT.IJsonSerializer json = new JS();
            JWT.IBase64UrlEncoder Base64 = new JWT.JwtBase64UrlEncoder();

            JwtEncoder en = new JwtEncoder(Algorithm, json, Base64);
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            return en.Encode(u, keyBytes);
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="token">解密字符串</param>
        /// <returns></returns>
        public UUdata GetUU(string token)
        {
            IJsonSerializer js = new JS();
            IJwtValidator validator = new JwtValidator(js, new JWT.UtcDateTimeProvider());
            JWT.IBase64UrlEncoder Base64 = new JWT.JwtBase64UrlEncoder();
            JwtDecoder en = new JwtDecoder(js, Base64);
            return en.DecodeToObject<UUdata>(token);
        }
    }
    //数据类
    class UUdata
    {
        public string name { get; set; }
        public string password { get; set; }
        public string type { get; set; }
    }
//josn 
    class JS : JWT.IJsonSerializer
    {
        public T Deserialize<T>(string json)
        {
            return JsonConvert.DeserializeObject<T>(json);
        }

        public string Serialize(object obj)
        {
            return JsonConvert.SerializeObject(obj);
        }
    }
}

3.看看运行结果


点赞+关注?

学习之路一点点前进

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表