如何在.net6webapi中配置Jwt实现鉴权验证

这篇具有很好参考价值的文章主要介绍了如何在.net6webapi中配置Jwt实现鉴权验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JWT(Json Web Token)

jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名。头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则是对头部和载荷的加密结果。

jwt鉴权验证是指在用户登录成功后,服务器生成一个jwt令牌并返回给客户端,客户端在后续的请求中携带该令牌,服务通过令牌的签名来确定用户的身份和权限。这种方式可以避免在每个请求中都需要进行身份验证,提高了系统的性能和安全性。

jwt具有以下优点:

1.无状态:jwt令牌包含了所有必要的信息,服务器不需要再每个请求中都进行身份验证,避免了服务器存储会话信息的开销。

2.可扩展性:jwt令牌可以包含任意的信息,可以根据需要添加自定义的字段。

3.安全性:jwt令牌使用签名来保证数据的完整性和真实性,防止数据被篡改或伪造。

4.跨平台:jwt令牌是基于json格式的,可以再不同的变成语言和平台之间进行传递和解析。

如何在webapi中使用JWT?

1.首先在项目中添加如下两个包

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt

也可以直接在Nuget包管理工具中搜索

如何在.net6webapi中配置Jwt实现鉴权验证

2.创建JwtOptions模型类,同时在appsetting.json中添加对应配置

    public class JwtOptions
    {
        /// <summary>
        /// 签发者
        /// </summary>
        public string Issuer { get; set; }

        /// <summary>
        /// 接收者
        /// </summary>
        public string Audience { get; set; }

        /// <summary>
        /// 密钥
        /// </summary>
        public string Key { get; set; }

        /// <summary>
        /// 过期时间
        /// </summary>
        public int ExpireSeconds { get; set; }
    }
  "JWT": {
    "Issuer": "签发方",
    "Audience": "接受方",
    "Key": "A86DA130-1B95-4748-B3B2-1B6AA9F2F743",//加密密钥
    "ExpireSeconds": 600 //密钥过期时间
  }

3.创建JWTExtensions静态类,添加AddJWTAuthentication扩展方法

    public static class JWTExtensions
    {
        public static AuthenticationBuilder AddJWTAuthentication(this IServiceCollection services, JwtOptions jwtOptions)
        {
            return services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(x =>
                {
                    x.TokenValidationParameters = new()
                    {
                        ValidateIssuer = true,//是否验证发行商
                        ValidateAudience = true,//是否验证受众者
                        ValidateLifetime = true,//是否验证失效时间
                        ValidateIssuerSigningKey = true,//是否验证签名键
                        ValidIssuer = jwtOptions.Issuer,
                        ValidAudience = jwtOptions.Audience,
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOptions.Key))
                    };
                });
        }
    }

4.创建SwaggerGenOptionsExtensions静态类,添加AddAuthenticationHeader扩展方法,为swagger增加Authentication报文头

 

    public static class SwaggerGenOptionsExtensions
    {
        /// <summary>
        /// 为swagger增加Authentication报文头
        /// </summary>
        /// <param name="option"></param>
        public static void AddAuthenticationHeader(this SwaggerGenOptions option)
        {
            option.AddSecurityDefinition("Authorization",
                new OpenApiSecurityScheme
                {
                    Description = "Authorization header. \r\nExample:Bearer 12345ABCDE",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    Scheme = "Authorization"
                }
                ); ;

            option.AddSecurityRequirement(new OpenApiSecurityRequirement()
            {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference=new OpenApiReference
                        {
                            Type=ReferenceType.SecurityScheme,
                            Id="Authorization"
                        },
                        Scheme="oauth2",
                        Name="Authorization",
                        In=ParameterLocation.Header,
                    },
                    new List<string>()
                }
            });
        }
    }

5.创建IJwtService接口及实现JwtService类,其为构建token服务

    public interface IJwtService
    {
        string BuildToken(IEnumerable<Claim> claims, JwtOptions options);
    }
    public class JwtService : IJwtService
    {
        public string BuildToken(IEnumerable<Claim> claims, JwtOptions options)
        {
            //过期时间
            TimeSpan timeSpan = TimeSpan.FromSeconds(options.ExpireSeconds);//token过期时间
            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(options.Key));//加密的token密钥
            var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);//签名证书,其值为securityKey和HmacSha256Signature算法
            var tokenDescriptor = new JwtSecurityToken(options.Issuer, options.Audience, claims, expires: DateTime.Now.Add(timeSpan), signingCredentials: credentials);//表示jwt token的描述信息,其值包括Issuer签发方,Audience接收方,Claims载荷,过期时间和签名证书
            return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);//使用该方法转换为字符串形式的jwt token返回
        }
    }

6.将上述服务尽数注册

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IJwtService, JwtService>();
JwtOptions jwtOpt = builder.Configuration.GetSection("JWT").Get<JwtOptions>();
builder.Services.AddJWTAuthentication(jwtOpt);
builder.Services.Configure<SwaggerGenOptions>(c =>
{
    c.AddAuthenticationHeader();
});

var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection();
app.UseAuthentication();//注意,一定得先启动这个
app.UseAuthorization();
//以下回答来自GPT
//app.UseAuthentication()是启用身份验证中间件,它会验证请求中的身份信息,并将身份信息存储在HttpContext.User属性中。而app.UseAuthorization()是启用授权中间件,它会检查HttpContext.User中的身份信息是否有访问当前请求所需的权限。
//一定要先启用身份验证中间件再启用授权中间件,因为授权中间件需要使用身份验证中间件存储的身份信息来进行权限验证。如果没有启用身份验证中间件,授权中间件将无法获取到身份信息,从而无法进行权限验证。
app.MapControllers();
app.Run();

7.在控制器中添加[ApiController]特性开启jwt鉴权,在登录接口中返回token

    [ApiController]
    [Route("[controller]/[action]")]
    [Authorize]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;
        //jwt服务

        private readonly IJwtService _jwtService;

        private readonly IConfiguration _configuration;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, IJwtService jwtService, IConfiguration configuration)
        {
            _logger = logger;
            _jwtService = jwtService;
            _configuration = configuration;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }

        //AllowAnonymous允许匿名访问
        [AllowAnonymous, HttpGet]
        public string GetToken()
        {
            var jwtopntion = _configuration.GetSection("JWT").Get<JwtOptions>();
            List<Claim> claims = new List<Claim>();
            claims.Add(new Claim(ClaimTypes.Name, "用户1"));
            claims.Add(new Claim(ClaimTypes.Role, "超级管理员"));
            return _jwtService.BuildToken(claims, jwtopntion);
        }
    }

效果测试

如何在.net6webapi中配置Jwt实现鉴权验证

 

直接调用Get方法返回401,鉴权失败

 

如何在.net6webapi中配置Jwt实现鉴权验证

 调用GetToken方法,取得token

如何在.net6webapi中配置Jwt实现鉴权验证

 点击右上角绿色按钮

如何在.net6webapi中配置Jwt实现鉴权验证

 value中输入的值为bearer,空一格,加上之前取得的token,点击授权

如何在.net6webapi中配置Jwt实现鉴权验证

 调用成功文章来源地址https://www.toymoban.com/news/detail-468215.html

到了这里,关于如何在.net6webapi中配置Jwt实现鉴权验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • .NET WebAPI 运用JWT鉴权授权

    1:引用需要的程序集 :System.IdentityModel.Token.JWT 2:创建一个新的控制器,用于授权功能 3:服务中进行注册 4:启动鉴权授权 5:在需要的鉴权授权的API  中调用 6:发送请求接口时候  请求头 {Authorzation:\\\"bearer\\\"+空格 + token}

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

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

    2023年04月21日
    浏览(67)
  • ASP.NET Core 8.0 WebApi 从零开始学习JWT登录认证

    我一起写后端Api我都是直接裸连的,但是现在为了规范一些,我还是打算上一个JWT功能 ASP.NET Web API 2系列(四):基于JWT的token身份认证方案 Jwt-dotnet github 选好了模板,就进去看看号了,42M的下载量已经很高了,一般来说,只要超过500k的下载量,基本就是一个稳定的代码仓库了

    2024年04月09日
    浏览(45)
  • Ubuntu 安装.net6.0+配置 .net环境变量

    wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh sudo chmod +x ./dotnet-install.sh 该脚本默认安装最新的 长期支持 (LTS) SDK 版本,即 .NET 6。 若要安装最新版本(可能不是 LTS) 版本的 (版本),请使用  --version latest  参数。 ./dotnet-install.sh --version latest 若要安装 .NET 运行时而非 SDK,

    2024年02月09日
    浏览(44)
  • .NET6读取appsettings.json配置

    基于 .NET 6.0 创建的 WebAPI 项目,自动生成的 appsettings.json 配置模板,在当前项目(dll)中可以通过构造函数注入 Configuration 来读取。 那么不在当前项目中怎么读取配置呢?例如下面这样的项目, appsesttings.json 在 Xuanjun.Blog.Server.API 中,但是想在 Xuanjun.Blog.Server.Core 读取配置,怎么

    2024年02月10日
    浏览(45)
  • 收集.NET6中一些常用组件的配置

    介绍 .NET 6的CoreApp框架,用来学习.NET6的一些变动和新特性,使用EFCore,等一系列组件的运用; 软件架构 分为模型层,服务层,接口层来做测试使用 0.如何使用IConfiguration、Environment 直接在builder后的主机中使用。 1.如何使用Swagger .NET 6 自带模板已经默认添加Swagger,直接使用即

    2024年02月07日
    浏览(45)
  • .NET Core WebAPI中封装Swagger配置

    创建一个Utility/SwaggerExt文件夹,添加一个类 在SwaggerExt类中添加方法,将相关配置添写入 调用封装的方法

    2024年02月20日
    浏览(43)
  • .net core .net6 读取数据库 读取配置文件 保姆级教程

    本文环境 Microsoft Visual Studio 2022 .Net6 SQLServer2019 在解决方案管理器右键添加相关的包,如下两个包 Microsoft.Data.SqlClient SQLServer SQLServer数据库 Microsoft.Extensions.Configuration.Json json配置文件 添加配置文件 appsettings.json,选始终复制 添加json配置文件内容如下 DefaultConnection 根据自己的

    2024年02月08日
    浏览(50)
  • 如何在 .NET Core WebApi 中处理 MultipartFormDataContent

    最近在对某个后端服务做 .NET Core 升级时,里面使用了多处处理 MultipartFormDataContent 相关内容的代码。这些地方从 .NET Framework 迁移到 .NET Core 之后的代码改动较大,由于本身没有测试覆盖,导致在部署 QA 环境后引发了一些问题。这里做一个技术复盘。 我们在做后端接口开发的

    2023年04月19日
    浏览(44)
  • Asp.net core Webapi 如何执行定时任务?

    在计算机系统中,定时执行一些后台任务是很常见的场景,比如定时发送邮件、备份数据等等。 那么,.NET 技术如何通过编程灵活地实现项目里复杂的自定义任务呢? 如果是 Windows 生态,通常来说,可以有这些方式: 编写一个程序,通过 Windows 内置的任务计划来定时执行。

    2024年02月04日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包