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