asp.net core 自动刷新token还有跨域的问题

在服务端刷新token,放到响应header里面,前端死活得不到值。最后发现因为用的是自定义newtoken,前端在跨域中读不到。

加入扩展头跨域,解决问题。

两个问题

1>服务器自动刷新token

public class FlushTokenMiddleware
{
private readonly RequestDelegate _next;
private readonly JWTHelperService jWTHelperService;

public FlushTokenMiddleware(RequestDelegate next,
JWTHelperService JWTHelperService)
{
_next = next;
jWTHelperService = JWTHelperService;

}

public async Task InvokeAsync(HttpContext context)
{
JwtSecurityToken token = null;
string authorization = context.Request.Headers["Authorization"];

if (!string.IsNullOrEmpty(authorization)
&& authorization.StartsWith("Bearer "))
token = new JwtSecurityTokenHandler().
ReadJwtToken(authorization.Substring("Bearer ".Length));

//刷新Token
if (token != null
&& token.ValidTo > DateTime.UtcNow
&& token.ValidTo.AddMinutes(-100) <= DateTime.UtcNow)
{
Console.WriteLine(DateTime.UtcNow.ToString("F"));

var username = context.User.Claims.FirstOrDefault(q => q.Type == SysDefineConstValue.UserName);
var rolename = context.User.Claims.FirstOrDefault(q => q.Type == SysDefineConstValue.Role);
var roleid = context.User.Claims.FirstOrDefault(q => q.Type == SysDefineConstValue.RoleId);
var userid = context.User.Claims.FirstOrDefault(q => q.Type == SysDefineConstValue.UserId);
var deptid = context.User.Claims.FirstOrDefault(q => q.Type == SysDefineConstValue.ShopId);

var jwttoken = jWTHelperService.CreateOrFreshToken(null, username?.Value??"",
rolename?.Value??"", userid?.Value??"", deptid?.Value??"",
roleid?.Value??"");

context.Response.Headers.Add("newtoken",jwttoken);
}
await _next(context);

}

扩展

public static class FlushTokenMiddlewareExtend
{
public static IApplicationBuilder UseFlushToken(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<FlushTokenMiddleware>();
}
}

 

注册

 

app.UseAuthorization();
app.UseFlushToken();

 

2>跨域设置

services.AddCors(options =>
options.AddPolicy(MyAllowSpecificOrigins,
p => p.AllowCredentials()
.AllowAnyMethod()
.SetIsOriginAllowed(_ => true)
.AllowAnyHeader()
.WithExposedHeaders("newtoken")
.SetPreflightMaxAge(TimeSpan.FromSeconds(60)))
);//跨域

 

3>vue拦截获取

if (response.headers.newtoken) {
      setToken(response.headers.newtoken)
    }
posted @   forhells  阅读(228)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2017-04-24 分布式开发记录1 粗暴的设计及粗暴采用的技术
点击右上角即可分享
微信分享提示