.net core 实例教程(十一)生成JWT格式的token密码配置及代码
小白浏览:7352024-03-21 16:31:00本文累计收益:0我也要赚钱

本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh

系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V

本文实现访问接口秘钥功能,用户登录成功后,接口返回给前端JWT格式的秘钥,之后再访问其他接口需要提供秘钥,否则不允许访问。

一、JWT生成相关代码

在SignUp.Common项目创建JWT文件夹,在文件夹下面创建如下类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

//JWT秘钥生成接口
namespace SignUp.Common.JWT
{
    public interface ITokenService
    {
        string BuildToken(IEnumerable<Claim> claims, JWTOptions options);
    }
}

//实现JWT接口
using Microsoft.IdentityModel.Tokens;
using SignUp.Common.Extensions;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace SignUp.Common.JWT
{
    public class TokenService : ITokenService
    {
        /// <summary>
        /// 生成JWT
        /// </summary>
        /// <param name="claims"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public string BuildToken(IEnumerable<Claim> claims, JWTOptions options)
        {
            TimeSpan ExpiryDuration = TimeSpan.FromSeconds(options.ExpireSeconds);
            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(options.SecKey));
            var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
            var tokenDescriptor = new JwtSecurityToken(options.Issuer, options.Audience, claims,
                expires: DateTime.Now.Add(ExpiryDuration), signingCredentials: credentials);
            return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
        }
        /// <summary>
        /// 获取过期时间
        /// </summary>
        /// <param name="jwtStr"></param>
        /// <returns></returns>
        public static DateTime GetExp(string jwtStr)
        {
            var jwtHandler = new JwtSecurityTokenHandler();
            JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);

            DateTime expDate = (jwtToken.Payload[JwtRegisteredClaimNames.Exp] ?? 0).GetInt().GetTimeSpmpToDate();
            return expDate;
        }
        public static bool IsExp(string jwtStr)
        {
            return GetExp(jwtStr) < DateTime.Now;
        }
    }
}
//JWT配置参数类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SignUp.Common.JWT
{
    public class JWTOptions
    {
        /// <summary>
        /// JWT Issuer
        /// </summary>
        public string Issuer { get; set; }
        /// <summary>
        /// JWT Audience
        /// </summary>
        public string Audience { get; set; }
        /// <summary>
        /// JWT SecKey
        /// </summary>
        public string SecKey { get; set; }
        /// <summary>
        /// JWT 过期时间
        /// </summary>
        public int ExpireSeconds { get; set; }
    }
}
//注册服务
using Microsoft.Extensions.DependencyInjection;
using SignUp.Common.Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SignUp.Common.JWT
{
    class ModuleInitializer : IModuleInitializer
    {
        public void Initialize(IServiceCollection services)
        {
            services.AddScoped<ITokenService, TokenService>();
        }
    }
}
二、配置JWT 在WebApplicationBuilderExtensions类的ConfigureExtraServices方法中增加如下代码:
//JWT生成参数配置,从数据库读取
JWTOptions jwtOpt = configuration.GetSection("JWT").Get();
services.Configure(configuration.GetSection("JWT"));
学习交流

评论列表
发表评论
+ 关注