.Net6 WebApi + JWTBearer身份认证的简单实现

这篇具有很好参考价值的文章主要介绍了.Net6 WebApi + JWTBearer身份认证的简单实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

.Net6 WebApi + JWTBearer身份认证的简单实现

开发环境

  • VS2022
  • .Net6 WebApi
  • using Microsoft.AspNetCore.Authentication.JwtBearer;
    using Microsoft.IdentityModel.Tokens;

配置文件

在 appsettings.json 文件添加

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "JWT": {
    "SecretKey": "Apple20230711@Apple.com",
    "Issuer": "Apple",
    "ExpiresMinutes": 120,
    "Audience": "customer"
  }
}

实体类

TokenParameter.cs

    public class TokenParameter
    {
        public string Issuer { get; set; }
        public string Audience { get; set; }
        public string SecretKey { get; set; }
        public double ExpiresMinutes { get; set; }
    }

配置类

AppSettings.cs

public static class AppSettings
{
    public static TokenParameter tokenParameter { get; set; }

    public static void Init(IConfiguration configuration)
    {
        tokenParameter = new TokenParameter();
        configuration.Bind("JWT", tokenParameter);
    }
}

Program类

Program.cs

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using System.Text;
using System.Text.Json.Serialization;

var builder = WebApplication.CreateBuilder(args);

var config = builder.Configuration;
// Add services to the container.
AppSettings.Init(config);

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
    options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "请输入token ,格式为 Bearer xxxxx.xxxxx.xxxxx",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });
    options.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type=ReferenceType.SecurityScheme,
                    Id="Bearer"
                }
            } , new string[]{}
        }
    });
});

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidIssuer = AppSettings.tokenParameter.Issuer,
        ValidateAudience = true,
        ValidAudience = AppSettings.tokenParameter.Audience,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AppSettings.tokenParameter.SecretKey))
    };
    options.Events = new JwtBearerEvents
    {
        OnChallenge = context =>
        {
            context.HandleResponse();
            var payload = JsonConvert.SerializeObject(new { Code = "401", Message = "很抱歉,您无权访问该接口" });
            context.Response.StatusCode = StatusCodes.Status200OK;
            context.Response.ContentType = "application/json";
            context.Response.WriteAsync(payload);
            return Task.CompletedTask;
        }
    };
});
builder.Services.AddTransient<ITokenService, TokenService>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthentication();

app.UseAuthorization();

app.MapControllers();

app.Run();

token接口和实现

ITokenService.cs 接口类

    public interface ITokenService
    {
        string GetToken();
    }

TokenService.cs 实现类

    public class TokenService : ITokenService
    {
        public string GetToken()
        {
            var claims = new[]
            {
                new Claim("Id","10001"),
                new Claim("Name","Admin")
            };

            var key = AppSettings.tokenParameter.SecretKey;

            var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));

            var algorithm = SecurityAlgorithms.HmacSha256;

            var signature = new SigningCredentials(secretKey, algorithm);

            var expires = Convert.ToDouble(AppSettings.tokenParameter.ExpiresMinutes);

            var token = new JwtSecurityToken(
                AppSettings.tokenParameter.Issuer,
                AppSettings.tokenParameter.Audience,
                claims,
                DateTime.Now,
                DateTime.Now.AddDays(expires),
                signature
                );

            var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);

            return jwtToken;
        }
    }

控制器类

TokenController.cs 中Login()获取token的值

    [ApiController]
    [Route("api/[controller]/[action]")]
    public class TokenController : ControllerBase
    {
        private readonly ITokenService _tokenService;
        public TokenController(ITokenService tokenService)
        {
            _tokenService = tokenService;
        }
        [HttpGet(Name = "Login")]
        public IActionResult Login()
        {
            if (!ModelState.IsValid)
            {
                return BadRequest("Name or Password can not be Empty");
            }

            var token = _tokenService.GetToken();

            return Ok(token);
        }
    }

业务调用

WeatherForecastController.cs 中的方法加上[Authorize]特性文章来源地址https://www.toymoban.com/news/detail-551110.html

    [ApiController]
    [Route("api/[controller]/[action]")]
    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;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        [Authorize]
        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();
        }
    }

到了这里,关于.Net6 WebApi + JWTBearer身份认证的简单实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 常见的身份认证技术

    (1)   口令认证技术(用户名/密码) 这是最简单也是最传统的身份认证方法,通过口令来验证用户的合法有效性。 通过用户名  ID  和用户密码  PW  来认证用户。 只要能够正确验证密码,系统就判定操作者是合法用户。 口令认证主要适用于小型封闭型系统。 存在的问题

    2024年02月06日
    浏览(54)
  • NACOS身份认证绕过

    一、漏洞描述 Nacos是Alibaba的一个动态服务发现、配置和服务管理平台。攻击者通过添加Nacos-Server的User-Agent头部将可绕过(nacos.core.auth.enabled=true)鉴权认证,从而进行API操作。 二、漏洞利用 访问 http://xxxxx/nacos/v1/auth/users?username=testpassword=test ,并使用burpsuite进行抓包,将方法

    2024年02月16日
    浏览(46)
  • ES开启身份认证

    X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 X-Pack的发展演变: 1,5.X版本之前:没有x-pack,是独立的:security安全,watch查看,alert警告等独立单元。 2,5.X版本:对原本的安全,警告,监视,图形和报告做了一个封装,形成了x-pac

    2024年02月14日
    浏览(40)
  • Nodejs七、身份认证

    1、Web 开发模式 (1)目前主流的 Web 开发模式 基于 服务端渲染 的传统 Web 开发模式 基于 前后端分离 的新型 Web 开发模式 (2)服务端渲染的 Web 开发模式 服务器发送给客户端的 HTML 页面,是在服务器通过字符串的拼接,动态生成的。 客户端不需要使用 Ajax 这样的技术额外请

    2024年02月09日
    浏览(47)
  • Nacos身份认证漏洞

    公司Nacos版本有用的2.0.1和2.0.3的都复现了身份认证的漏洞,无需认证身份就可以查看用户列表以及注册新用户,并且注册上来的新用户可以查看所有public命名空间下的配置资源! 1、查看用户列表 URL: http://ip:8848/nacos/v1/auth/users?pageNo=1pageSize=1 方法类型:GET 返回结果: 如图示

    2023年04月10日
    浏览(45)
  • 鉴权与身份认证

    ​ 所谓鉴权就是 身份认证 ,就是验证您是否有权限从服务器访问或操作相关数据。通俗的讲就是一个门禁,您想要进入室内,必须通过门禁验证身份,这就是鉴权,如打开一个网站必须要输入用户名和密码才可以登录进入,这种就是鉴权,还有一些业务需要登录以后才可以

    2024年03月14日
    浏览(69)
  • 数据库与身份认证

    能够知道如何配置MySQL数据库环境 能够认识并使用常见的SQL语句操作数据库 能够在Express中操作MySQL数据库 能够了解Session的实现原理 能够了解JWT的实现原理 数据库的概念 安装并配置MySQL MySQL的基本使用 在Express中操作MySQL 前后端的身份认证 数据库(database)是用来 阻止、存储和

    2024年02月10日
    浏览(45)
  • API身份认证JWT

    是一种身份认证的开放标准(RFC 7519),可以在网络应用间传输信息作为Json对象。由三部分组成:头部(Header)、载荷(payload)和签名(Signature). 头部(Header) 两部分组成,令牌类型和所使用的的签名算法   载荷(payload) 包含要传输的信息,包括用户的身份信息、权限等。载

    2024年02月13日
    浏览(39)
  • Smartbi 身份认证绕过漏洞

    因为自己搭建的环境存在一些问题,可能是版本过高的原因,(奇奇怪怪的问题,用户没有权限),所以目前仅仅做概念性验证,对漏洞的原理进行分析。 在未登录的情况下访问接口  /smartbi/vision/RMIServlet ​ 我们可以比较明显的看到对应的处理类  CheckIsLoggedFilter ​ smartbi.fre

    2024年02月16日
    浏览(42)
  • 身份证识别ocr、身份证实名认证接口文档

    每一次验证背后,都是对用户数据安全的承诺,对平台信誉的坚守。翔云身份证实名认证API,通过身份证识别接口仅需一键上传身份证图片即可快速识别身份证信息,翔云实名认证接口实时联网查验证件信息的真伪。 ​PHP身份证实名认证接口文档代码如下:

    2024年04月17日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包