JWT认证方式之-System.IdentityModel.Tokens.Jwt

jwt加密:

using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using IdentityModel;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;

/// <summary>
/// jwt加密
/// </summary>
/// <param name="data">加密内容</param>
/// <param name="key">加密秘钥</param>
/// <returns>加密字符串</returns>
public string Token(string data ,string key)
        {
            /**
              * Claims (Payload)
                    Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:

                    Issuer: The issuer of the token,token 是给谁的  发送者
                    audience: 接收的
                    subject: The subject of the token,token 主题
                    Expires: Expiration Time。 token 过期时间,Unix 时间戳格式
                    IssuedAt: Issued At。 token 创建时间, Unix 时间戳格式
                    NOtBefore: 生效时间
                    除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
                 * */
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(JwtClaimTypes.Audience,"Client2")
                }),// 加密的内容
                Expires = expiresAt,//过期时间
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(key)), SecurityAlgorithms.HmacSha256Signature)//秘钥
            };
            var token = tokenHandler.CreateToken(tokenDescriptor);
            var tokenString = tokenHandler.WriteToken(token);
            return tokenString ;
        }

jwt解密:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IdentityModel;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;

namespace WebApiJwtDemo
{
    public class Startup
    {
        public void TokenDecrypt(string token,string key)
        {
            string result= string.Empty;//加密内容
            try
            {
                ClaimsPrincipal principal = new ClaimsPrincipal();
                JwtSecurityToken jwt = null;
                var handler = new JwtSecurityTokenHandler();
                jwt = handler.ReadJwtToken(token);
                // 根据token是否正常解析
                if(jwt == null){
                    return "";
                }
                // 验证token是否有效
                var TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidIssuer = "发送者(TokenCreate)",
                        ValidAudience = "接收者(TokenServer)",
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(key)),
                        RequireExpirationTime = true,
                        ClockSkew = TimeSpan.Zero,
                        ValidateLifetime = true
    
                        /***********************************TokenValidationParameters的参数默认值***********************************/
                        // RequireSignedTokens = true,
                        // SaveSigninToken = false,
                        // ValidateActor = false,
                        // 将下面两个参数设置为false,可以不验证Issuer和Audience,但是不建议这样做。    
                        // ValidateAudience = true,
                        // ValidateIssuer = true, 
                        // ValidateIssuerSigningKey = false,
                        // 是否要求Token的Claims中必须包含Expires
                        // RequireExpirationTime = true,
                        // 允许的服务器时间偏移量,默认300秒
                        // ClockSkew = TimeSpan.FromSeconds(300),
                        // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
                        // ValidateLifetime = true
                    };
                SecutityToken sercutityToken = null;
                // 验证token是否有效,如果过期,报错SecurityTokenExpiredException
                // 报错信息:IDX10223 : Lifetime validation failed
                principal = handler.ValidateToken(token, TokenValidationParameters ,out securityToken);
                if(principal !=null && principal.Claims.Count() > 0){
                    Claim claim = principal.Claims.First();
                    result = claim.Value;
                }
            }
            catcy(SecurityTokenExpireException ex){
                //可以在这写续期代码
            }
            return result;
        }
        
    }
}

注册TOKEN

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值