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

2 篇文章 0 订阅
1 篇文章 0 订阅

.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]特性

    [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();
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用.NET 6 Web API实现JWT认证的示例代码: 1. 首先,安装所需的NuGet包: ``` dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package System.IdentityModel.Tokens.Jwt ``` 2. 在Program.cs文件中进行配置: ```csharp using Microsoft.IdentityModel.Tokens; var builder = WebApplication.CreateBuilder(args); // 添加JWT认证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "your_issuer", // 发行者 ValidAudience = "your_audience", // 受众 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")) // 密钥 }; }); builder.Services.AddControllers(); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); ``` 3. 创建一个控制器来处理认证请求: ```csharp using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; [Authorize] [ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { [AllowAnonymous] [HttpPost("login")] public IActionResult Login(string username, string password) { // 假设这里是验证用户名和密码的逻辑 // 如果验证通过,创建一个JWT token并返回给客户端 var token = GenerateToken(username); return Ok(new { token }); } [HttpGet("protected")] public IActionResult Protected() { // 受保护的路由,只有经过认证的用户才能访问 return Ok("You have accessed the protected route."); } private string GenerateToken(string username) { var claims = new[] { new Claim(ClaimTypes.Name, username), // 可以添加其他自定义的claims }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: "your_issuer", audience: "your_audience", claims: claims, expires: DateTime.Now.AddMinutes(30), // token过期时间 signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); } } ``` 以上示例代码演示了如何使用.NET 6 Web APIJWT实现身份认证。请注意替换示例中的"your_issuer"、"your_audience"和"your_secret_key"为适合你的实际情况的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值