在ASP.NET Core中轻松使用JwtBeare进行身份验证

这篇具有很好参考价值的文章主要介绍了在ASP.NET Core中轻松使用JwtBeare进行身份验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JwtBearer简介

首先要搞清楚什么是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份验证提供程序。它提供了对JWT令牌进行验证的功能,然后允许将令牌中包含的声明(claims)用于用户身份验证和授权控制。

Json Web Token (JWT)是一种Web标准,用于在不同系统间传输数据。JWT是一种可验证的和安全的方式,用于在各种应用程序之间传递信息。JWT具有一定的安全性,因为它是通过密钥对JWT进行签名的,以确保意味着不能进行篡改或伪造。

JWT由三个部分组成,分别为:“Header”、“Payload”和“Signature” 。其中,“header”表示JWT的元数据(元信息),用于描述加密信息和算法;“payload”表示JWT的指令部分,用于承载用户状态或授权相关的信息;“signature”表示JWT的签名信息,用于验证JWT的有效性。

JwtBearer首先使用“header”中声明的算法对JWT进行身份验证,以确保其未被篡改。然后,它将使用密钥根据“payload”中的信息生成令牌,以在用户请求中将其传递。

JwtBearer提供了配置选项,以允许您使用自定义的密钥和算法生成和验证JWT令牌。它还允许您配置应用程序特定的声明,以在用户的身份验证和授权管理中使用。

在.NET Core中使用

1)、首先新建一个APS.NET Core项目,然后在项目中添加JwtBearer包,可以用nuget包管理器添加,也可以使用nuget命令添加,命令如下:

dotnet add package  Microsoft.AspNetCore.Authentication.JwtBearer

2)新建一个JwtConfig类,用了存储token相关数据。

public class JwtConfig
    {
        public string Key { get; set; } //key
        public int Expres { get; set; } //过期时间(单位秒)
        public string Issuer { get; set; }
        public string Audience { get; set; }
    }

3)、在appsettings.json中配置jwt密钥

//配置文件appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  //JWT的配置内容
  "JWT": {//key必须有足够的长度
      "Key": "asfasfdflj134aanjkdsjiio1232sdasdfdfkandsf12",
    "expres": "3",
     "Issuer": "https://localhost:7201",
    "Audience": "https://localhost:7201",
  }
}

4)在program.cs文件注入JwtBearer

//注入配置类
builder.Services.Configure<JwtConfig>(builder.Configuration.GetSection("JWT"));

5)新建一个类,专门创建token

//依赖注入
  private readonly IOptionsSnapshot<JwtConfig> jwtconfig;
  public Demo3Controller(IOptionsSnapshot<JwtConfig> jwtconfig)
  {
     this.jwtconfig = jwtconfig;
  }
public string CreateToken()
{
    // 创建声明列表,即 Token 中携带的信息
    List<Claim> claims = new List<Claim>();
    claims.Add(new Claim(ClaimTypes.Name, "admin")); // 添加用户名
    claims.Add(new Claim(ClaimTypes.NameIdentifier, "1080")); // 添加用户 ID

    // 设置 Token 的过期时间
    DateTime expres = DateTime.Now.AddSeconds(jwtconfig.Value.Expres);
    Console.WriteLine($"过期时间{expres}");

    // 从配置文件中获取 JWT 密钥并转换为字节数组
    byte[] secbyse = Encoding.UTF8.GetBytes(jwtconfig.Value.Key);

    // 创建 SymmetricSecurityKey 对象并使用 HmacSha256 算法对密钥进行签名
    var secKey = new SymmetricSecurityKey(secbyse);
    var credetials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256);

    // 创建 JwtSecurityToken 对象并设置声明、过期时间和签名信息
    var tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expres, signingCredentials: credetials);

    // 生成 JWT Token 字符串并返回
    string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
    return jwt;
}

6)再在program.cs文件中验证传入的token,代码如下:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(opt =>
{
    var JwtOtp = builder.Configuration.GetSection("JWT").Get<JwtConfig>();
    byte[] keybase = Encoding.UTF8.GetBytes(JwtOtp.Key);
    var seckey = new SymmetricSecurityKey(keybase);
    opt.TokenValidationParameters = new()
    {
        ValidateIssuer = false,
        ValidateAudience = false,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = seckey,

    };
    opt.Events = new JwtBearerEvents
    {
        //权限验证失败后执行
        OnChallenge = context =>
        {
            //终止默认的返回结果
            context.HandleResponse();
            string token = context.Request.Headers["Authorization"];
            var result = JsonConvert.SerializeObject(new { code = 401, message = "登录过期" });
            if (string.IsNullOrEmpty(token))
            {
                result = JsonConvert.SerializeObject(new { code = 401, message = "token不能为空" });
                context.Response.ContentType = "application/json";
                //验证失败返回401
                context.Response.StatusCode = StatusCodes.Status200OK;
                context.Response.WriteAsync(result);
                return Task.FromResult(result);
            }
            try
            {
                JwtSecurityTokenHandler tokenheader = new();
                ClaimsPrincipal claimsPrincipal = tokenheader.ValidateToken(token, opt.TokenValidationParameters, out SecurityToken securityToken);
            }
            catch (SecurityTokenExpiredException)
            {
                result = JsonConvert.SerializeObject(new { code = 401, message = "登录已过期" });
                context.Response.ContentType = "application/json";
                //验证失败返回401
                context.Response.StatusCode = StatusCodes.Status200OK;
                context.Response.WriteAsync(result);
                return Task.FromResult(result);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                result = JsonConvert.SerializeObject(new { code = 402, message = "token令牌无效" });
                context.Response.ContentType = "application/json";
                //验证失败返回401
                context.Response.StatusCode = StatusCodes.Status200OK;
                context.Response.WriteAsync(result);
                return Task.FromResult(result);
            }
            context.Response.ContentType = "application/json";
            //验证失败返回401
            context.Response.StatusCode = StatusCodes.Status200OK;
            context.Response.WriteAsync(result);
            return Task.FromResult(result);
        }
    };
});
app.UseAuthentication();//.NETCore验证中间件,必须有。并且在   app.UseAuthorization();之前

7)、在需要权限的方法或控制器上加上特性[Authorize]

[HttpGet(Name = "GetAuthorize")]
 [Authorize]
public IEnumerable<WeatherForecast> Get()
{
    //doing
}

这样就完成了JwtBearer验证的代码,具体调用见下文。

调用流程如下:

1)、首先获得Token

可以通过登录验证后生成。如果是接口程序通过接口获得。

效果如下:

在ASP.NET Core中轻松使用JwtBeare进行身份验证

2)、获取Token后在请求头添加Authorization验证,并输入获得的Token,需要注意的是Token前面需要加Bearer并添加一个空格。

效果如下:

在ASP.NET Core中轻松使用JwtBeare进行身份验证

如果Token为空的效果:

在ASP.NET Core中轻松使用JwtBeare进行身份验证

注:在swagger加token需要另外在program.cs配置,代码如下:

builder.Services.AddSwaggerGen(s =>
{
    //添加安全定义
    s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "请输入token,格式为 Bearer xxxxxxxx(注意中间必须有空格)",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });
    //添加安全要求
    s.AddSecurityRequirement(new OpenApiSecurityRequirement {
    {
        new OpenApiSecurityScheme{
            Reference =new OpenApiReference{
                Type = ReferenceType.SecurityScheme,
                Id ="Bearer"
            }
        },new string[]{ }
    }
});
});

添加好重启程序后会在swagger的右上方增加如下按钮,打开按钮根据提示即可完成添加。

在ASP.NET Core中轻松使用JwtBeare进行身份验证

结语

本文介绍了ASP.NET Core如使用JwtBearer,以及JwtBearer生成token验证的验证过程。希望对你有所收获,欢迎留言或吐槽。文章来源地址https://www.toymoban.com/news/detail-445267.html

来源公众号:DotNet开发跳槽

到了这里,关于在ASP.NET Core中轻松使用JwtBeare进行身份验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET Core使用JWT+标识框架(identity)实现登录验证

    最近阅读了《ASP.NET Core 技术内幕与项目实战——基于DDD与前后端分离》(作者杨中科)的第八章,对于Core入门的我来说体会颇深,整理相关笔记。 JWT:全称“JSON web toke”,目前流行的跨域身份验证解决方案; 标识框架(identity):由ASP.NET Core提供的框架,它采用RBAC(role

    2024年02月11日
    浏览(45)
  • ASP.NET Core 中使用 WebSocket 协议进行实时通信

    介绍 在 ASP.NET Core 中使用 WebSocket 协议创建实时通信的完整示例涉及几个步骤。在此示例中,我们将创建一个简单的聊天应用程序,用户可以在其中实时发送和接收消息。此示例假设您对 ASP.NET Core 和 C# 有基本了解。 步骤1.创建一个新的ASP.NET Core项目 首先,使用 Visual Studio 或

    2024年01月25日
    浏览(51)
  • asp.net web api 用户身份验证

            前后端分离的开发中,应用服务需要进行用户身份的验证才允许访问数据。实现的方法很简单。创建一个webapi项目。在App_Start目录下找到WebApiConfig.cs, 在里面增加一个实现类。 Controller 类的实现:

    2024年02月20日
    浏览(40)
  • 实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】

    集成测试可在包含应用支持基础结构(如数据库、文件系统和网络)的级别上确保应用组件功能正常。 ASP.NET Core 通过将单元测试框架与测试 Web 主机和内存中测试服务器结合使用来支持集成测试。 集成测试与单元测试相比,能够在更广泛的级别上评估应用的组件,确认多个

    2024年04月22日
    浏览(43)
  • 2步轻松实现ASP.NET Core托管服务执行定时任务

    最近接到一个新项目,需要在项目里添加一个后台任务,定时去发邮件通知客户;由于是一个比较小型的项目,不希望引入Quartz.Net、Hangfire等太重的框架,同时也没持久化要;寻觅了一下发现ASP.NET Core本身带有托管服务,可以执行定时任务。ASP.NET Core提供了IHostedService接口,

    2024年02月06日
    浏览(47)
  • 【asp.net core】自定义模型绑定及其验证

    水此篇博客,依旧是来自群里的讨论,最后说到了,在方法参数自定义了一个特性,用来绑定模型,优先从Form取,如果为空,或者不存在,在从QueryString中获取并且绑定,然后闲着无聊,就水一篇博客,如果大家有什么需求或者问题,可以找我,很高兴能为你们带来帮助。

    2024年02月03日
    浏览(45)
  • ASP.NET Core Web API之Token验证

    在实际开发中,我们经常需要对外提供接口以便客户获取数据,由于数据属于私密信息,并不能随意供其他人访问,所以就需要验证客户身份。那么如何才能验证客户的什么呢?今天以一个简单的小例子,简述ASP.NET Core Web API开发过程中,常用的一种JWT身份验证方式。仅供学

    2024年02月11日
    浏览(50)
  • 前后端分离,Asp.net core webapi 简单 2 步,轻松配置跨域

    可以说,前后端分离已经成为当今信息系统项目开发的主流软件架构模式,微服务的出现,让前后端分离发展更是迅速,大量优秀的前端框架如 vue.js、react 的出现,也让前后端分离趋势加快。 所谓的前后端分离软件架构模式,就是指将前端和后端的开发完全分离,后端负责

    2024年01月17日
    浏览(44)
  • ASP.NET CORE WEBAPI 登录 JWT 鉴权 ,接口权限验证

    介绍 当今Web开发中,API的使用越来越广泛,而API的安全性也变得越来越重要。其中,JWT(JSON Web Token)鉴权和授权是一种常见的解决方案。 本篇文章将会介绍JWT鉴权和授权的原理、实现方式以及注意事项。 什么是JWT? JWT是一种基于JSON格式的开放标准(RFC7519),用于在网络

    2023年04月21日
    浏览(67)
  • 【C#/.NET】使用ASP.NET Core对象池

    Microsoft.Extensions.ObjectPool   减少初始化/资源分配,提高性能。这一条与线程池同理,有些对象的初始化或资源分配耗时长,复用这些对象减少初始化和资源分配。比如:我有一个执行耗时约500毫秒,内存空间 2KB的任务为此创建一个新线程异步执行,而创建线程耗时1秒,内存空

    2024年02月06日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包