96SEO 2026-02-19 21:56 0
configuration[JWTToken:Issuer];

configuration[JWTToken:Audience];
configuration[JWTToken:SecretKey];
builder.Services.AddAuthentication(options
JwtBearerDefaults.AuthenticationScheme;
{options.TokenValidationParameters
TokenValidationParameters(){//过期时间容错值解决服务器端时间不同步问题秒//允许服务器时间偏移量30秒即我们配置的过期时间加上这个允许偏移的时间值才是真正过期的时间(过期时间
TimeSpan.FromSeconds(30),//要求Token的Claims中必须包含ExpiresRequireExpirationTime
true,//是否在令牌期间验证签发者ValidateIssuer
true,//是否验证失效时间ValidateLifetime
true,//是否验证签名SecurityKeyValidateIssuerSigningKey
Audience,//密钥SecurityKeyIssuerSigningKey
SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey)),
builder.Services.AddSingleton(new
#endregion//注入Swagger注入这个才能在调试接口时输入token
builder.Services.AddSwaggerGen(options
{options.AddSecurityRequirement(new
Microsoft.OpenApi.Models.OpenApiSecurityRequirement{{new
OpenApiSecurityScheme{Referencenew
OpenApiReference{IdBearer,TypeReferenceType.SecurityScheme},},Array.Emptystring()}});options.AddSecurityDefinition(Bearer,
Microsoft.OpenApi.Models.OpenApiSecurityScheme{Description
Microsoft.OpenApi.Models.ParameterLocation.Header,Type
Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey});
builder.Services.AddCors(policy
opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().WithExposedHeaders(X-Pagination));
4.相关配置结束后我们得生成Token这时我们创建一个专门生成Token的类里面有两个生成Token的方法想用哪个用哪个。
该类在Program里有引用。
//HttpContext.User.Identity.Namenew
//HttpContext.User.IsInRole(r_admin)new
Claim(JwtRegisteredClaimNames.Jti,
SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration[JWTToken:SecretKey]));//
SecurityAlgorithms.HmacSha256;//
_configuration[JWTToken:Issuer],
_configuration[JWTToken:Audience],
System.DateTime.Now.AddHours(48),
//有效期设置为48小时signingCredentials:
//数字签名,用于生成Token的Header,其余都是荷载数据);//
JwtSecurityTokenHandler().WriteToken(Token);return
Claim(JwtRegisteredClaimNames.Jti,
PassWord)//密码可以要求使用特定加密技术加密//new
SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration[JWTToken:SecretKey]));//
SecurityAlgorithms.HmacSha256;//
_configuration[JWTToken:Issuer],
_configuration[JWTToken:Audience],
System.DateTime.Now.AddHours(48),
//有效期设置为48小时signingCredentials:
//数字签名,用于生成Token的Header,其余都是荷载数据);//
JwtSecurityTokenHandler().WriteToken(Token);return
5.这时可以生成Token了我们来新建一个控制器来生成一个试试:
jwtHelper;}[HttpPost][Route(Token)]public
_jwtHelper.CreateLoginToken(token.Name,
6.既然可以生成Token了那么就该给控制器授权了总不能让每个携带Token的用户能访问系统所以的API吧那样会出现垂直越权的情况渗透测试过不了哦。
此处着重说Policy方式对Role方法感兴趣的可以看我前面的Cookie方式验证。
6.1首先新建一个JwtAuthorizationRequirement类(类名不固定)用于继承IAuthorizationRequirement
{//这里可以扩展一些其他的角色或者需要的东西.//txt参数是在使用策略授权时传入进来的例如:Authorize(Policy
JwtAuthorizationRequirement(string
6.2然后新建一个JwtAuthorizationHandler类继承AuthorizationHandlerJwtAuthorizationRequirement
MVC继承AuthorizeAttribute实现JWT的拦截器的效果。
AuthorizationHandlerJwtAuthorizationRequirement
HandleRequirementAsync(AuthorizationHandlerContext
Task.CompletedTask;}//requirement.Name
context.User.Claims.FirstOrDefault(p
requirement.Name)?.Value;string?
context.User.Claims.FirstOrDefault(p
PassWord)?.Value;//这里时数据库或者其他方式校验
(Account1234){context.Succeed(requirement);}else{context.Fail();}return
builder.Services.AddSingletonIAuthorizationHandler,
builder.Services.AddAuthorization(p
JwtAuthorizationRequirement(Account));});
DateTime.Now.AddDays(index),TemperatureC
Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();}
PermissionAuthorizationRequirement
参数是在使用策略授权时传入进来的例如:Authorize(Policy
PermissionAuthorizationRequirement(string
AuthorizationHandlerPermissionAuthorizationRequirement{protected
HandleRequirementAsync(AuthorizationHandlerContext
PermissionAuthorizationRequirement
requirement){//取出当前用户的所有Permission的参数var
_.Value).ToList();//是否满足授权满足则运行
_.StartsWith(requirement.Name))){context.Succeed(requirement);}else{context.Fail();}return
builder.Services.AddSingletonIAuthorizationHandler,
PermissionAuthorizationHandler();
builder.Services.AddAuthorization(options
{options.AddPolicy(Permissions.UserCreate,
PermissionAuthorizationRequirement(Permissions.UserCreate)));options.AddPolicy(Permissions.UserUpdate,
PermissionAuthorizationRequirement(Permissions.UserUpdate)));options.AddPolicy(Permissions.UserDelete,
PermissionAuthorizationRequirement(Permissions.UserDelete)));options.AddPolicy(Permissions.UserSelect,
PermissionAuthorizationRequirement(Permissions.UserSelect)));
WebApplication.CreateBuilder(args);//
container.builder.Services.AddControllers();
https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
//首先引用Microsoft.AspNetCore.Mvc.NewtonsoftJson包。
再在builder.Services.AddControllers()后添加相应内容
builder.Services.AddControllers().AddNewtonsoftJson(options
{//设置JSON返回数据格式大小写与Model一致options.SerializerSettings.ContractResolver
DefaultContractResolver();//设置一般API的日期格式options.SerializerSettings.DateFormatString
configuration[JWTToken:Issuer];
configuration[JWTToken:Audience];
configuration[JWTToken:SecretKey];
builder.Services.AddAuthentication(options
JwtBearerDefaults.AuthenticationScheme;
{options.TokenValidationParameters
TokenValidationParameters(){//过期时间容错值解决服务器端时间不同步问题秒//允许服务器时间偏移量30秒即我们配置的过期时间加上这个允许偏移的时间值才是真正过期的时间(过期时间
TimeSpan.FromSeconds(30),//要求Token的Claims中必须包含ExpiresRequireExpirationTime
true,//是否在令牌期间验证签发者ValidateIssuer
true,//是否验证失效时间ValidateLifetime
true,//是否验证签名SecurityKeyValidateIssuerSigningKey
Audience,//密钥SecurityKeyIssuerSigningKey
SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey)),
builder.Services.AddSingleton(new
builder.Services.AddSingletonIAuthorizationHandler,
builder.Services.AddAuthorization(p
JwtAuthorizationRequirement(Account));});
});builder.Services.AddSingletonIAuthorizationHandler,
PermissionAuthorizationHandler();
builder.Services.AddAuthorization(options
{options.AddPolicy(Permissions.UserCreate,
PermissionAuthorizationRequirement(Permissions.UserCreate)));options.AddPolicy(Permissions.UserUpdate,
PermissionAuthorizationRequirement(Permissions.UserUpdate)));options.AddPolicy(Permissions.UserDelete,
PermissionAuthorizationRequirement(Permissions.UserDelete)));options.AddPolicy(Permissions.UserSelect,
PermissionAuthorizationRequirement(Permissions.UserSelect)));
builder.Services.AddSwaggerGen(options
{options.AddSecurityRequirement(new
Microsoft.OpenApi.Models.OpenApiSecurityRequirement{{new
OpenApiSecurityScheme{Referencenew
OpenApiReference{IdBearer,TypeReferenceType.SecurityScheme},},Array.Emptystring()}});options.AddSecurityDefinition(Bearer,
Microsoft.OpenApi.Models.OpenApiSecurityScheme{Description
Microsoft.OpenApi.Models.ParameterLocation.Header,Type
Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey});
builder.Services.AddCors(policy
opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().WithExposedHeaders(X-Pagination));
(app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();app.MapControllers();app.Run();参考链接:ASP.NET
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback