Asp.NetCore3.1 WebApi 使用Jwt 授权认证使用

1:导入NuGet包 Microsoft.AspNetCore.Authentication.JwtBearer

2:配置 jwt相关信息

3:在 startUp中

public void ConfigureServices(IServiceCollection services){
#region JWT 认证
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
var jsonmodel = AppJsonHelper.InitJsonModel();
options.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = jsonmodel.Issuer,// Configuration["JwtSetting:Issuer"],
ValidAudience = jsonmodel.Audience,// Configuration["JwtSetting:Audience"],
// IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSetting:SecurityKey"])),
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jsonmodel.TockenSecrete)),
// 默认允许 300s 的时间偏移量,设置为0即可
ClockSkew = TimeSpan.Zero
};
});
#endregion
}

//注意需要放在addmvc上面 services.AddMvc();

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();//身份验证
app.UseAuthorization();// 授权
}

4:使用时在Controller /action 上打上特性 [Authorize]

可以单独在Action上打上特性[Authorize]  不需要检查授权认证的话打上特性: [AllowAnonymous]
两个特性类都在如下命名空间下:
using Microsoft.AspNetCore.Authorization;

5:登陆成功后端并返回生成的Tocken,可以在PostMan上面测试,和JWT.io官网上面来测试

6: 发送请求到后端,带上Tocken 如Get ://localhost:5000/user/login
Key value
Authorization Bearer qweTdfdsfsJhdsfd0.fdsfdsgfdsewDDQDD.fdsfdsg***

7:action上面的code

[HttpPost, Route("Login")]
        public ApiResult Login(personnel p)
        {
            ApiResult result = new ApiResult();
            try
            {
                string tockenStr = ZrfJwtHelper.GetTocken(p);
                result.data = tockenStr;
                result.code = statuCode.success;
                result.message = "获取成功!";
            }
            catch (Exception ex)
            {
                result.message = "查询异常:" + ex.Message;
            }
            return result;
        }


        [HttpPost, Route("authTest")]
        [Authorize]
        [AllowAnonymous]// 跳过授权认证
        public ApiResult authTest(string accesTocken)
        {
            ApiResult result = new ApiResult();
            try
            {
                var info = ZrfJwtHelper.GetTockenInfo(accesTocken);
                result.data = info;
                result.code = statuCode.success;
                result.message = "获取成功!";
            }
            catch (Exception ex)
            {
                result.message = "查询异常:" + ex.Message;
            }
            return result;
        }

8:完整的Jwt代码封装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZRFCoreTestMongoDB.Commoms
{
    using Microsoft.AspNetCore.Http;
    using Microsoft.IdentityModel.Tokens;
    using System.IdentityModel.Tokens.Jwt;
    using System.Security.Claims;
    using System.Text;
    using ZRFCoreTestMongoDB.Model;

    /// <summary>
    /// @auth fengge
    /// </summary>
    public class ZrfJwtHelper
    {
        /// <summary>
        /// 生成Tocken
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public static string GetTocken(personnel p)
        {
            //读取配置文件获得Jwt的json文件信息
            var model = AppJsonHelper.InitJsonModel();
            string _issuer = model.Issuer;//分发者
            string audience = model.Audience;//接受者
            string TockenSecrete = model.TockenSecrete;//秘钥

            //秘钥
            var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TockenSecrete)), SecurityAlgorithms.HmacSha256);
            // 設定要加入到 JWT Token 中的聲明資訊(Claims)
            //var claims = new List<Claim>();
             在 RFC 7519 規格中(Section#4),總共定義了 7 個預設的 Claims,我們應該只用的到兩種!
            claims.Add(new Claim(JwtRegisteredClaimNames.Iss, issuer));
            //claims.Add(new Claim(JwtRegisteredClaimNames.Sub, userInfo.UserId));

            //Claim
            var claims = new Claim[] {
                    new Claim(JwtRegisteredClaimNames.Sid,p.Uid),
                    new Claim(JwtRegisteredClaimNames.Iss,_issuer),
                    new Claim(JwtRegisteredClaimNames.Sub,p.Name),
                    new Claim("Guid",Guid.NewGuid().ToString("D")),
                    new Claim("Roleid",p.Roleid.ToString()),
                    new Claim("Age",p.Age.ToString()),
                    new Claim("BirthDay",p.BirthDay.ToString())
            };

            SecurityToken securityToken = new JwtSecurityToken(
                issuer: _issuer,
                audience: audience,
                signingCredentials: securityKey,
                expires: DateTime.Now.AddMinutes(2),//过期时间
                claims: claims
                );

            return new JwtSecurityTokenHandler().WriteToken(securityToken);
        }

        /// <summary>
        /// 获取accessTocken
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public static string GetTockenString(HttpContext context)
        {
            return context != null ? context.Request.Headers["Authorization"].ToString() : "";
        }

        /// <summary>
        /// 解析Jwt生成的 Tocken
        /// </summary>
        /// <param name="accesTocken"></param>
        /// <returns></returns>
        public static TockenInfo GetTockenInfo(string accesTocken)
        {
            try
            {
                if (accesTocken.Contains("Bearer")) //防止前端传过来的tocken 为待了 Bearer 的字符串
                {
                    accesTocken = accesTocken.Replace("Bearer ", "");
                }
                var tockHandler = new JwtSecurityToken(accesTocken);
                TockenInfo info = new TockenInfo
                {
                    // Age=tockHandler.Claims.FirstOrDefault(c=>c.Type==JwtRegisteredClaimNames.Email)
                    Uid = tockHandler.Claims.FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Sid).Value,
                    Name = tockHandler.Claims.FirstOrDefault(c => c.Type ==JwtRegisteredClaimNames.Sub).Value,//在于自己来定义了,上面生成是和下面获取时Key要一致

                    Age = tockHandler.Claims.FirstOrDefault(c => c.Type == "Age").Value,
                    BirthDay = tockHandler.Claims.FirstOrDefault(c => c.Type == "BirthDay").Value,
                    Roleid = tockHandler.Claims.FirstOrDefault(c => c.Type == "Roleid").Value,
                };
                return info;
            }
            catch (Exception ex)
            {
                throw new Exception("解析Tocken时错误!");
            }
        }
    }
    public class TockenInfo
    {
        public string Uid { get; set; }
        public string Name { get; set; }
        public string Age { get; set; }
        public string BirthDay { get; set; }
        public string Roleid { get; set; }
    }
}

9:模型实体

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ZRFCoreTestMongoDB.Model
{
    using System.ComponentModel.DataAnnotations;
    [Serializable]
    public class personnel
    {

        [Required(ErrorMessage = "姓名必填")]
        [StringLength(maximumLength: 10, ErrorMessage = "姓名最多是10个字符")]
        [MinLength(2, ErrorMessage = "姓名长度最少为两个字符")]
        public string Name { get; set; }

        [Range(1, 150, ErrorMessage = "年龄范围为:1-150")]
        public int Age { get; set; }
        [DataType(DataType.Date, ErrorMessage = "生日不学为日期格式,例如:1998-10-10")]
        public DateTime BirthDay { get; set; }

        [Required(ErrorMessage = "密码必填")]
        [StringLength(maximumLength: 10, MinimumLength = 6, ErrorMessage = "密码长度最多10位")]
        public string Password { get; set; }
        public int Roleid { get; set; }
        public string Uid { get; set; }
    }
}

10:配置内容:

11:测试效果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值