公司网站横幅是做的吗平面设计师资格证怎么考
2026/3/12 15:27:08 网站建设 项目流程
公司网站横幅是做的吗,平面设计师资格证怎么考,湖北seo关键词排名优化软件,孟村县网站建设公司ASP.NET Core JWT 认证与授权实战指南 什么是 JWT#xff1f; JWT#xff08;JSON Web Token#xff09;是一种基于 JSON 的开放标准#xff08;RFC 7519#xff09;#xff0c;用于在各方之间安全地传输信息。JWT 可以被验证和信任#xff0c;因为它是数字签名的。 JWT…ASP.NET Core JWT 认证与授权实战指南什么是 JWTJWTJSON Web Token是一种基于 JSON 的开放标准RFC 7519用于在各方之间安全地传输信息。JWT 可以被验证和信任因为它是数字签名的。JWT 通常由三部分组成用点.分隔头部Header包含令牌的类型和使用的签名算法。载荷Payload包含声明claims如用户 ID、角色等。签名Signature用于验证令牌的完整性。一个典型的 JWT 看起来像这样example.jwt.io为什么需要 JWT在传统的认证系统中服务器通常会在会话中存储用户信息并向客户端发送一个会话 ID。客户端在后续的请求中使用这个会话 ID 来标识自己。这种方式有以下缺点服务器端存储服务器需要存储会话信息这会增加服务器的负担。水平扩展困难如果应用程序部署在多个服务器上需要在服务器之间共享会话信息这会增加系统的复杂性。跨域问题在跨域请求中会话 cookie 可能会被阻止。JWT 解决了这些问题因为无状态JWT 包含了所有必要的信息服务器不需要存储会话信息。易于水平扩展由于服务器不需要存储会话信息应用程序可以轻松地部署在多个服务器上。跨域友好JWT 可以通过 HTTP 头在不同域之间传递。如何使用 JWT 实现认证和授权在 ASP.NET Core 中我们可以使用Microsoft.AspNetCore.Authentication.JwtBearer包来实现 JWT 认证和授权。下面我们将通过具体的示例来演示如何使用 JWT 实现认证和授权。步骤 1安装必要的包首先我们需要在项目中安装必要的包dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package System.IdentityModel.Tokens.Jwt dotnet add package Microsoft.Extensions.Options步骤 2创建 JWT 相关类2.1 创建 JwtSettings 类首先我们创建一个JwtSettings类用于存储 JWT 的配置选项namespaceFrameLearning.BasicComponents.Jwt{publicclassJwtSettings{publicstringSecret{get;set;}publicstringIssuer{get;set;}publicstringAudience{get;set;}publicintExpirationInMinutes{get;set;}}}在这个示例中我们创建了一个JwtSettings类它包含Secret、Issuer、Audience和ExpirationInMinutes四个属性用于存储 JWT 的密钥、颁发者、受众和过期时间。2.2 创建 UserCredentials 类接下来我们创建一个UserCredentials类用于存储登录请求的数据namespaceFrameLearning.BasicComponents.Jwt{publicclassUserCredentials{publicstringUsername{get;set;}publicstringPassword{get;set;}}}在这个示例中我们创建了一个UserCredentials类它包含Username和Password两个属性用于存储用户的用户名和密码。2.3 创建 UserResponse 类然后我们创建一个UserResponse类用于存储登录响应的数据namespaceFrameLearning.BasicComponents.Jwt{publicclassUserResponse{publicstringUsername{get;set;}publicstringToken{get;set;}publicListstringRoles{get;set;}}}在这个示例中我们创建了一个UserResponse类它包含Username、Token和Roles三个属性用于存储用户的用户名、JWT 令牌和角色。2.4 创建 IJwtService 接口和 JwtService 类最后我们创建一个IJwtService接口和JwtService类用于生成和验证 JWT 令牌usingMicrosoft.Extensions.Options;usingMicrosoft.IdentityModel.Tokens;usingSystem.IdentityModel.Tokens.Jwt;usingSystem.Security.Claims;usingSystem.Text;namespaceFrameLearning.BasicComponents.Jwt{publicinterfaceIJwtService{stringGenerateToken(stringusername,Liststringroles);ClaimsPrincipalValidateToken(stringtoken);}publicclassJwtService:IJwtService{privatereadonlyJwtSettings_jwtSettings;publicJwtService(IOptionsJwtSettingsjwtSettings){_jwtSettingsjwtSettings.Value;}publicstringGenerateToken(stringusername,Liststringroles){// 验证 JwtSettings 的属性是否为 nullif(string.IsNullOrEmpty(_jwtSettings.Secret)){thrownewException(JwtSettings.Secret 不能为空);}if(string.IsNullOrEmpty(_jwtSettings.Issuer)){thrownewException(JwtSettings.Issuer 不能为空);}if(string.IsNullOrEmpty(_jwtSettings.Audience)){thrownewException(JwtSettings.Audience 不能为空);}if(_jwtSettings.ExpirationInMinutes0){_jwtSettings.ExpirationInMinutes30;// 默认 30 分钟}varclaimsnewListClaim{newClaim(ClaimTypes.Name,username),newClaim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString())};// 添加角色声明foreach(varroleinroles){claims.Add(newClaim(ClaimTypes.Role,role));}varkeynewSymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Secret));varcredsnewSigningCredentials(key,SecurityAlgorithms.HmacSha256);vartokennewJwtSecurityToken(issuer:_jwtSettings.Issuer,audience:_jwtSettings.Audience,claims:claims,expires:DateTime.Now.AddMinutes(_jwtSettings.ExpirationInMinutes),signingCredentials:creds);returnnewJwtSecurityTokenHandler().WriteToken(token);}publicClaimsPrincipalValidateToken(stringtoken){vartokenHandlernewJwtSecurityTokenHandler();varkeyEncoding.UTF8.GetBytes(_jwtSettings.Secret);try{varprincipaltokenHandler.ValidateToken(token,newTokenValidationParameters{ValidateIssuerSigningKeytrue,IssuerSigningKeynewSymmetricSecurityKey(key),ValidateIssuertrue,ValidateAudiencetrue,ValidIssuer_jwtSettings.Issuer,ValidAudience_jwtSettings.Audience,ValidateLifetimetrue,ClockSkewTimeSpan.Zero},outSecurityTokenvalidatedToken);varjwtToken(JwtSecurityToken)validatedToken;if(jwtToken.ValidToDateTime.UtcNow){thrownewSecurityTokenExpiredException(Token has expired);}returnprincipal;}catch{returnnull;}}}}在这个示例中我们创建了一个IJwtService接口它定义了GenerateToken和ValidateToken两个方法用于生成和验证 JWT 令牌。然后我们创建了一个JwtService类它实现了IJwtService接口的方法。在GenerateToken方法中我们首先验证JwtSettings的属性是否为 null然后创建声明列表添加角色声明创建密钥和签名凭据创建 JWT 令牌最后返回令牌字符串。在ValidateToken方法中我们首先创建令牌处理器和密钥然后验证令牌最后返回声明主体。步骤 3配置 JWT 认证和授权在Program.cs文件中我们需要配置 JWT 认证和授权// 配置 JWTbuilder.Services.ConfigureJwtSettings(builder.Configuration.GetSection(JwtSettings));// 注册服务builder.Services.AddScopedIJwtService,JwtService();// 添加 JWT 认证和授权builder.Services.AddAuthentication(options{options.DefaultAuthenticateSchemeJwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeSchemeJwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options{options.TokenValidationParametersnewTokenValidationParameters{ValidateIssuertrue,ValidateAudiencetrue,ValidateLifetimetrue,ValidateIssuerSigningKeytrue,ValidIssuerbuilder.Configuration[JwtSettings:Issuer],ValidAudiencebuilder.Configuration[JwtSettings:Audience],IssuerSigningKeynewSymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration[JwtSettings:Secret]))};// 需要指定 JWT 角色映射关系options.TokenValidationParameters.RoleClaimTypeClaimTypes.Role;options.EventsnewJwtBearerEvents{OnChallengeasynccontext{// 跳过默认响应context.HandleResponse();context.Response.StatusCodeStatusCodes.Status401Unauthorized;context.Response.ContentTypeapplication/json;ApiResponseobjectapiResponsenewApiResponseobject();apiResponse.Code401;apiResponse.Messagecontext.ErrorDescription??提供的令牌无效;apiResponse.Datanull;apiResponse.Successfalse;awaitcontext.Response.WriteAsync(JsonSerializer.Serialize(apiResponse));}};});builder.Services.AddAuthorization();在这个示例中我们首先配置JwtSettings然后注册IJwtService服务接着添加 JWT 认证和授权最后注册授权服务。在添加 JWT 认证时我们配置了令牌验证参数包括验证颁发者、受众、过期时间和签名密钥以及指定 JWT 角色映射关系。我们还配置了OnChallenge事件用于自定义未授权响应。步骤 4添加登录端点在控制器中我们需要添加一个登录端点用于生成和返回 JWT 令牌[HttpPost(login)][AllowAnonymous]publicIActionResultLogin([FromBody]UserCredentialscredentials){varroles_userServer.GetRoles();// 生成tokenvartoken_jwtService.GenerateToken(credentials.Username,roles);returnOk(newUserResponse{Usernamecredentials.Username,Tokentoken,Rolesroles});}在这个示例中我们添加了一个Login方法它接受一个UserCredentials对象作为参数然后获取用户角色生成 JWT 令牌最后返回一个UserResponse对象包含用户名、令牌和角色。步骤 5添加授权保护的端点在控制器中我们可以添加一些需要授权才能访问的端点[HttpGet][Authorize(RolesAdmin)]publicIActionResultGet(){varforecastsEnumerable.Range(1,5).Select(indexnewWeatherForecast{DateDateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureCRandom.Shared.Next(-20,55),SummarySummaries[Random.Shared.Next(Summaries.Length)]}).ToArray();returnOk(forecasts);}在这个示例中我们添加了一个Get方法它使用[Authorize(Roles Admin)]特性标记表明只有具有Admin角色的用户才能访问这个方法。配置 JWT 设置在appsettings.json文件中我们需要配置 JWT 设置{JwtSettings:{Secret:X7gT$pL2mKq9!vN5sF8*oU4^jH6%zR,Issuer:TestApi,Audience:TestApiUsers,ExpirationInMinutes:60}}在这个示例中我们配置了 JWT 的密钥、颁发者、受众和过期时间。测试 JWT 认证和授权步骤 1获取 JWT 令牌首先我们需要发送一个 POST 请求到登录端点获取 JWT 令牌POST /weatherforecast/login Content-Type: application/json { username: John, password: 126.com }响应应该类似于{username:John,token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiSm9obiIsImp0aSI6ImI3MDExYjZlLTZhZTQtNDgxMS05MGFlLWQxMDBkNjA5M2JmOSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6IkFkbWluIiwiZXhwIjoxNzY4OTAwOTc4LCJpc3MiOiJUZXN0QXBpIiwiYXVkIjoiVGVzdEFwaVVzZXJzIn0.nggbL8AmiYEejRAFZzCX6Xhv5dAuNGfjy45hQ7d225o,roles:[Admin]}步骤 2使用 JWT 令牌访问受保护的端点然后我们可以使用获取到的 JWT 令牌访问受保护的端点GET /weatherforecast Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiSm9obiIsImp0aSI6ImI3MDExYjZlLTZhZTQtNDgxMS05MGFlLWQxMDBkNjA5M2JmOSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6IkFkbWluIiwiZXhwIjoxNzY4OTAwOTc4LCJpc3MiOiJUZXN0QXBpIiwiYXVkIjoiVGVzdEFwaVVzZXJzIn0.nggbL8AmiYEejRAFZzCX6Xhv5dAuNGfjy45hQ7d225o响应应该类似于[{date:2026-01-22,temperatureC:12,temperatureF:53,summary:Mild},{date:2026-01-23,temperatureC:23,temperatureF:73,summary:Warm},{date:2026-01-24,temperatureC:-5,temperatureF:23,summary:Freezing},{date:2026-01-25,temperatureC:34,temperatureF:93,summary:Hot},{date:2026-01-26,temperatureC:18,temperatureF:64,summary:Balmy}]步骤 3测试未授权访问如果我们不提供 JWT 令牌或者提供的令牌无效访问受保护的端点应该返回未授权响应GET /weatherforecast响应应该类似于{code:401,success:false,data:null,message:提供的令牌无效}JWT 和授权的最佳实践1. 安全存储密钥JWT 密钥应该安全存储不应该硬编码在代码中或者存储在版本控制系统中。建议使用环境变量或者密钥管理服务来存储 JWT 密钥。2. 设置合理的过期时间JWT 令牌应该设置合理的过期时间不宜过长也不宜过短。过长的过期时间会增加安全风险过短的过期时间会影响用户体验。建议根据应用程序的具体需求设置过期时间通常为 15 分钟到 24 小时之间。3. 使用 HTTPSJWT 令牌应该通过 HTTPS 传输以防止中间人攻击。4. 验证令牌在服务器端每次收到 JWT 令牌时都应该验证令牌的有效性包括验证签名、过期时间和声明。5. 实现令牌刷新机制为了避免用户频繁登录建议实现令牌刷新机制允许用户使用过期的令牌换取新的令牌。6. 限制令牌的使用范围JWT 令牌应该限制使用范围只允许访问必要的资源。可以通过在令牌中添加scope声明来实现。7. 监控和审计应该监控和审计 JWT 令牌的使用情况及时发现和处理异常情况。总结JWT 是一种基于 JSON 的开放标准用于在各方之间安全地传输信息。在 ASP.NET Core 中我们可以使用Microsoft.AspNetCore.Authentication.JwtBearer包来实现 JWT 认证和授权。通过本文的示例我们学习了如何创建 JWT 相关类包括JwtSettings、UserCredentials、UserResponse、IJwtService和JwtService。配置 JWT 认证和授权。添加登录端点用于生成和返回 JWT 令牌。添加授权保护的端点需要授权才能访问。配置 JWT 设置。测试 JWT 认证和授权。我们还学习了 JWT 和授权的最佳实践包括安全存储密钥、设置合理的过期时间、使用 HTTPS、验证令牌、实现令牌刷新机制、限制令牌的使用范围以及监控和审计。希望本文对你理解和使用 ASP.NET Core JWT 认证和授权有所帮助

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询