net6 jwt 认证

7 篇文章 0 订阅
1 篇文章 0 订阅
该文详细介绍了如何在ASP.NETCore应用中设置JWT(JSONWebToken)身份验证。首先,通过Nuget安装必要的包,然后配置appsettings.json文件,包括密钥、发行者、受众等信息。接着,配置跨域策略和身份验证服务,使用DI注入JWT操作类以生成和验证令牌。最后,创建一个自定义权限过滤器来检查登录状态,并在控制器中应用。
摘要由CSDN通过智能技术生成

其他文章内容

1,首先安装

Nuget 包 Microsoft.AspNetCore.Authentication.JwtBearer

2,配置 appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "JWT": {
    "SecretKey": "weblog@vip.qq.com",
    "Issuer": "2222",
    "Expires": 10,
    "Audience": "22333"
  }
}

3配置

//配置跨域
builder.Services.AddCors(policy =>
{
    policy.AddPolicy("CorsPolicy", opt => opt
    .AllowAnyOrigin()
    .AllowAnyHeader()
    .AllowAnyMethod()
    .WithExposedHeaders("X-Pagination"));
});

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidIssuer = builder.Configuration["JWT:Issuer"],
        ValidateAudience = true,
        ValidAudience = builder.Configuration["JWT:Audience"],
        ValidateLifetime = true,
        IssuerSigningKey = 
        new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]))
    };
});

3配置中间件

//使用跨域
app.UseCors("CorsPolicy");

app.UseAuthentication();
app.UseAuthorization();

4添加jwt操作类

   public class TokenHelper
    {
        private readonly IConfiguration _configuration;
        private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler;
        public TokenHelper(IConfiguration configuration, JwtSecurityTokenHandler jwtSecurityTokenHandler)
        {
            _configuration = configuration;
            _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
        }
        /// <summary>
        /// 创建加密JwtToken
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public string CreateJwtToken<T>(T user)
        {
            var claimList = this.CreateClaimList(user);
            //  从 appsettings.json 中读取SecretKey
            var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:SecretKey"]));
            // 从 appsettings.json 中读取Expires
            var expires = Convert.ToDouble(_configuration["JWT:Expires"]);
            //  选择加密算法
            var algorithm = SecurityAlgorithms.HmacSha256;
            // 生成Credentials
            var signingCredentials = new SigningCredentials(secretKey, algorithm);
            JwtSecurityToken jwtSecurityToken = new JwtSecurityToken(
              _configuration["JWT:Issuer"],     //Issuer
               _configuration["JWT:Audience"],   //Audience
               claims: claimList,
               DateTime.Now,                    //notBefore
               DateTime.Now.AddDays(expires),   //expires
               signingCredentials               //Credentials
               );
            string jwtToken = _jwtSecurityTokenHandler.WriteToken(jwtSecurityToken);
            return jwtToken;
        }

        public T GetToken<T>(string Token)
        {
            Type t = typeof(T);
            try
            {

                object objA = Activator.CreateInstance(t);
                var b = _jwtSecurityTokenHandler.ReadJwtToken(Token);
                foreach (var item in b.Claims)
                {
                    PropertyInfo _Property = t.GetProperty(item.Type);
                    if (_Property != null && _Property.CanRead)
                    {
                        _Property.SetValue(objA, item.Value, null);
                    }

                }
                return (T)objA;

            }
            catch (Exception)
            {
                return default(T);
            }
        }


        /// <summary>
        /// 创建包含用户信息的CalimList
        /// </summary>
        /// <param name="authUser"></param>
        /// <returns></returns>
        private List<Claim> CreateClaimList<T>(T authUser)
        {
            var Class = typeof(User);
            List<Claim> claimList = new List<Claim>();
            foreach (var item in Class.GetProperties())
            {
                claimList.Add(new Claim(item.Name, Convert.ToString(item.GetValue(authUser))));
            }
            return claimList;
        }




    }
    /// <summary>
    /// 登录用户信息
    /// </summary>
    public class User
    {
        public int UserID { get; set; }
        public string Email { get; set; }

        public string Name { get; set; }
        public string Role { get; set; }


        public User(int userID = default, string name = default, string email = default, string role = default)
        {
            this.UserID = userID;
            this.Name = name;
            this.Email = email;
            this.Role = role;
        }
    }
    public class UserModel
    {
        public string UserID { get; set; }
        public string Email { get; set; }

        public string Name { get; set; }
        public string Role { get; set; }


        public UserModel()
        {

        }
    }

5添加自定义权限过滤器

  public class LoginAttrbuteFilter : IAuthorizationFilter
    {
        public JwtSecurityTokenHandler _jwtSecurityTokenHandler;
        private readonly TokenHelper _tokenHelper;
        public LoginAttrbuteFilter(
            JwtSecurityTokenHandler jwtSecurityTokenHandler, TokenHelper tokenHelper)
        {
            _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
            _tokenHelper = tokenHelper;
        }

        public  void OnAuthorization(AuthorizationFilterContext context)
        {
            var heads = context.HttpContext.Request.Headers["Authorization"];
            var a = _tokenHelper.GetToken<UserModel>(heads);
            if (a==null)
            {
                context.Result = new JsonResult(new {data="未登录"});
            }
        }

6 ioc注入

var services = builder.Services;
services.AddTransient<TokenHelper>();
services.AddTransient<LoginAttrbuteFilter>(); 
services.AddTransient<JwtSecurityTokenHandler>();

7实战

[ApiController]
[Route("api/[controller]/[action]")]
public class HomeController : ControllerBase
{
    private readonly ILogger<HomeController> _logger;
    private readonly IConfiguration _configuration;
    private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler;
    private readonly TokenHelper _tokenHelper;
    public HomeController(
        ILogger<HomeController> logger,
        IConfiguration configuration,
        JwtSecurityTokenHandler jwtSecurityTokenHandler,
        TokenHelper tokenHelper)
    {
        _logger = logger;
        _configuration = configuration;
        _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
        _tokenHelper = tokenHelper;
    }

    [HttpGet(Name = "Login")]
    public string Login()
    {
        var aaa = _tokenHelper.CreateJwtToken(new User(1, "22", "33", "44"));
        return aaa;

    }

    [HttpGet(Name = "Get")]

    public string Get()
    {
        return null;
    }

    [HttpGet(Name = "post")]
    [TypeFilter(typeof(LoginAttrbuteFilter))]
    public string post()
    {

        return "成功";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值