asp.net core 入口 验证token,但有的接口要跳过验证
在ASP.NET Core中,你可以使用中间件来验证token,并为特定的接口创建一个属性来标记是否跳过验证。以下是一个简化的例子:
-
创建一个自定义属性来标记是否跳过验证:
public class SkipTokenValidationAttribute : Attribute
{
public bool Skip { get; set; } = false;
}
-
创建中间件来验证token:
public class TokenValidationMiddleware
{
private readonly RequestDelegate _next;
public TokenValidationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint;
if (endpoint != null)
{
var actionMethod = "";//[control]/[action]
var controllerActionDescriptor = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
if (controllerActionDescriptor != null)
{
actionMethod = controllerActionDescriptor.AttributeRouteInfo?.Template;//.ControllerName;
}
if (context.Request.PathBase.Equals("", StringComparison.OrdinalIgnoreCase) && context.Request.Path.Equals("/", StringComparison.OrdinalIgnoreCase))
{
//访问域名(不包含其他地址信息),跳转到guest.html
context.Response.Redirect("Admin/admin/guest.html");
}
else
{
var skipAttr = endpoint.Metadata.GetMetadata<SkipTokenValidationAttribute>();
if (skipAttr?.Skip != null && skipAttr?.Skip != true)
{
var token = "";// context.Request.Query.
if(context.Request.Query!=null && context.Request.Query.ContainsKey("token"))
{
token = context.Request.Query["token"].ToString().Trim();
}
if (context.Request.Form!=null && context.Request.Form.ContainsKey("token"))
{
token = context.Request.Form["token"].ToString().Trim();
}
if(!string.IsNullOrEmpty(token))
{
//验证token...
}
else
{
context.Response.StatusCode = 401;
return;
}
// 验证token的逻辑
//var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
//if (token != null)
//{
// // 验证token的逻辑
// // 如果token无效,返回未授权的错误
// context.Response.StatusCode = 401;
// return;
//}
}
}
await _next(context);
}
}
}
-
注册中间件:在Startup.cs中的
Configure
方法中添加中间件(注意要写在app.UseRouting()之后):public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 其他中间件配置...
app.UseMiddleware<TokenValidationMiddleware>();
// 其他中间件配置...
添加自定义中间件用于处理域名跳转
// app.Use(async (context, next) =>
// {
// if (context.Request.PathBase.Equals("", StringComparison.OrdinalIgnoreCase) && context.Request.Path.Equals("/", StringComparison.OrdinalIgnoreCase))
// {
// //访问域名(不包含其他地址信息),跳转到guest.html
// context.Response.Redirect("Admin/admin/guest.html");
// }
// else
// {
// await next();
// }
// });
}
-
使用
SkipTokenValidationAttribute
属性来标记那些不需要验证token的接口://[ApiController] //有这个,好像接口字符参数都必须填写值
[Route("[controller]")]
[SkipTokenValidation]//控制下所有接口都要验证
//[ApiExplorerSettings(IgnoreApi = true)]//在swagger上隐藏该控制器
public class SkipTokenController : ControllerBase
{
// 这个接口会跳过token验证
[HttpGet]
[SkipTokenValidation(Skip = true)]
public IActionResult SkipValidation()
{
return Ok("This endpoint is skipping token validation.");
}
// 这个接口需要token验证
[HttpGet("validate")]
//[ApiExplorerSettings(IgnoreApi = true)]//在swagger上隐藏该接口
public IActionResult ValidateToken()
{
return Ok("This endpoint is requiring token validation.");
}
}
以上代码展示了如何在ASP.NET Core中创建一个中间件来验证token,并根据接口是否需要跳过验证来处理请求。在实际应用中,你需要替换验证token的逻辑以满足你的安全需求