JWT权限验证
using CommonUse; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System.Text; namespace API_JWT_Test { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. //builder.Services.AddAuthorization(); //开启Controller(1),作用是将控制器及其相关的服务注册到依赖注入容器中 builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); #region 读取配置信息 builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); var secretKeyString = builder.Configuration["JWT:SecretKey"]; if (secretKeyString == null) { throw new ArgumentNullException("JWT:SecretKey配置项未设置,请检查配置文件"); } JwtHelper.TokenParameter_Issuer = builder.Configuration["JWT:Issuer"] ?? ""; JwtHelper.TokenParameter_Audience = builder.Configuration["JWT:Audience"] ?? ""; JwtHelper.TokenParameter_SecretKey = builder.Configuration["JWT:SecretKey"] ?? ""; #endregion #region JWT相关 //添加JWT身份验证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true,//是否效验Issuer ValidateAudience = true,//是否效验Audience ValidateLifetime = true,//是否验证失效时间 ValidateIssuerSigningKey = true,//是否效验SigningKey ValidIssuer = JwtHelper.TokenParameter_Issuer,//颁发者 ValidAudience = JwtHelper.TokenParameter_Audience,//接收者 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtHelper.TokenParameter_SecretKey)) }; }); //配置Swagger身份验证输入(可选) builder.Services.AddSwaggerGen(options => { options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "请输入token,格式为 【Bearer JWT字符串】(注意中间必须有空格)", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, BearerFormat = "JWT", Scheme = "Bearer" }); //添加安全要求 options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme(){ Reference =new OpenApiReference { Type = ReferenceType.SecurityScheme, Id ="Bearer" } }, new string[]{ } } }); }); #endregion var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } //中间件,用于配置应用的身份验证机制。身份验证的目的是识别用户并将用户的身份信息添加到HttpContext.User中,以便后续的授权操作可以使用这些信息 app.UseAuthentication(); //中间件,用于检查用户是否有权限访问特定的资源。它的主要作用是根据HttpContext.User中的身份信息,判断用户是否有权访问请求的资源 app.UseAuthorization(); //开启Map(2),将controllerl里面的action映射为我们的终结点 app.MapControllers(); app.Run(); } } }
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespace CommonUse { /// <summary> /// https://jwt.io/ /// https://www.bilibili.com/video/BV1XN4y1x758/?spm_id_from=333.337.search-card.all.click&vd_source=de08aa2783692e0d4b1d0d24ef1cac94 /// </summary> public class JwtHelper { /// <summary> /// 颁发者 /// </summary> public static string TokenParameter_Issuer = "Redefine"; /// <summary> /// 接收者 /// </summary> public static string TokenParameter_Audience = "Redefine"; /// <summary> /// 签名秘钥,用于签名和验证令牌的密钥,需要保密 /// </summary> public static string TokenParameter_SecretKey = ""; /// <summary> /// AccessToken过期时间(分钟) /// </summary> public static int TokenParameter_AccessExpiration = 30; /// <summary> /// JWT生成的Token,共有三部分组成(使用逗号隔开),前两个用Base64进行编码,可以直接解码出明文,第三个为加密后的内容,用于验证明文内容(解密需使用Secret) /// </summary> /// <param name="userInfo"></param> /// <returns></returns> public static string GenerateJsonWebToken(User userInfo) { var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(TokenParameter_SecretKey)); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var claimsIdentity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme); claimsIdentity.AddClaim(new Claim("ID", "1001")); claimsIdentity.AddClaim(new Claim(ClaimTypes.Name, userInfo.UserName)); claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, "超级管理员")); var token = new JwtSecurityToken(TokenParameter_Issuer, TokenParameter_Audience, claimsIdentity.Claims, expires: DateTime.Now.AddMinutes(TokenParameter_AccessExpiration), signingCredentials: credentials); return new JwtSecurityTokenHandler().WriteToken(token); } } public class User { public string UserName { get; set; } = ""; public string UserPwd { get; set; } = ""; } }
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Security.Claims; namespace API_JWT_Test { [Authorize] [Route("api/[controller]/[Action]")] [ApiController] public class TestController : ControllerBase { [HttpPost] public ActionResult GetTestInfo() { var claimsPrincipal = this.HttpContext.User; var name = claimsPrincipal.Claims.FirstOrDefault(r => r.Type == ClaimTypes.Name)?.Value; var role = claimsPrincipal.Claims.FirstOrDefault(r => r.Type == ClaimTypes.Role)?.Value; var id = claimsPrincipal.Claims.FirstOrDefault(x => x.Type == "ID")?.Value; Dictionary<string, object?> dic = new Dictionary<string, object?>(); dic["Code"] = 1; dic["UseID"] = id; dic["Msg"] = "token 认证 成功"; return Ok(dic); } } }
using CommonUse; using Microsoft.AspNetCore.Mvc; namespace WebApplication1.Controllers { [Route("api/[controller]/[Action]")] [ApiController] public class AuthController : ControllerBase { [HttpPost] public ActionResult GetToken(User user) { if (user.UserName == "admin" && user.UserPwd == "123456") { string token = JwtHelper.GenerateJsonWebToken(user); return Ok(token); } Dictionary<string, object> data = new Dictionary<string, object>(); data["code"] = 2; data["msg"] = "帐号或密码错误"; return Ok(data); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2021-01-14 windows下安装 python环境