using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using System.Text;
namespaceJWTAspNetCoreTest01x02.Extensions { publicstaticclassJwtAuthenticationExtensions { publicstatic IServiceCollection AddJwtAuthentication( this IServiceCollection services, IConfiguration configuration) { var jwtConfig = configuration.GetSection("Jwt"); var key = Encoding.UTF8.GetBytes(jwtConfig["Key"]!);
using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespaceJWTAspNetCoreTest01x02; publicclassJwtService { privatereadonly IConfiguration _configuration;
publicstringGenerateToken(string userId, string username) { var jwtConfig = _configuration.GetSection("Jwt");
var key = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(jwtConfig["Key"]!) );
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[] { new Claim(ClaimTypes.NameIdentifier, userId), new Claim(ClaimTypes.Name, username), new Claim(ClaimTypes.Role, "Admin"), new Claim("custom", "customValue") };
var token = new JwtSecurityToken( issuer: jwtConfig["Issuer"], audience: jwtConfig["Audience"], claims: claims, expires: DateTime.UtcNow.AddMinutes(//尽量使用UtcNow Convert.ToDouble(jwtConfig["ExpireMinutes"]) ), signingCredentials: creds );
using JWTAspNetCoreTest01x02; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System.Text; using JWTAspNetCoreTest01x02.Extensions;
builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); //builder.Services.AddSwaggerGen();
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text;
namespaceJWTAspNetCoreTest01x02.Controllers { [Route("api/[controller]")] [ApiController] publicclassTestController : ControllerBase { privatereadonly IConfiguration _configuration; publicTestController(IConfiguration configuration) { _configuration = configuration; } [Authorize] [HttpGet("info")] public IActionResult GetInfo() { var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; var username = User.FindFirst(ClaimTypes.Name)?.Value; var role = User.FindFirst(ClaimTypes.Role)?.Value;//使用内置role时取消注释 //var role = User.FindFirst("role")?.Value;//使用自定义role时取消注释 //var roles = User.FindAll("role").Select(c => c.Value);//如果有多个角色,可以使用FindAll获取所有角色 return Ok(new { userId, username, role, message = "你已通过JWT认证" }); } [HttpPost] [Authorize(Roles = "Admin")] public ActionResult<object> DecodeJWT(string jwtToken) { if (string.IsNullOrEmpty(jwtToken)) return BadRequest("Token不能为空");
if (jwtToken.StartsWith("Bearer ")) jwtToken = jwtToken.Substring(7);
var handler = new JwtSecurityTokenHandler();
var token = handler.ReadJwtToken(jwtToken);
var claims = token.Claims.Select(c => new { c.Type, c.Value });
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using System.Text;
namespaceJWTAspNetCoreTest01x02.Extensions { publicstaticclassJwtAuthenticationExtensions { publicstatic IServiceCollection AddJwtAuthentication( this IServiceCollection services, IConfiguration configuration) { var jwtConfig = configuration.GetSection("Jwt"); var key = Encoding.UTF8.GetBytes(jwtConfig["Key"]!);
using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespaceJWTAspNetCoreTest01x02; publicclassJwtService { privatereadonly IConfiguration _configuration;
publicstringGenerateToken(string userId, string username) { var jwtConfig = _configuration.GetSection("Jwt");
var key = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(jwtConfig["Key"]!) );
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[] { new Claim(ClaimTypes.NameIdentifier, userId),//添加userId new Claim(ClaimTypes.Name, username),//添加username new Claim("role", "Admin"), new Claim("custom", "customValue") };
var token = new JwtSecurityToken( issuer: jwtConfig["Issuer"], audience: jwtConfig["Audience"], claims: claims, expires: DateTime.UtcNow.AddMinutes( Convert.ToDouble(jwtConfig["ExpireMinutes"]) ), signingCredentials: creds );