asp.net core api 项目(版本2.2),因为是老系统,系统先前一套自定义的身份验证方式,DefaultAuthenticateScheme 和 DefaultChallengeScheme 都为 “Custom”。
自定义身份验证方案类似于这种:
https://github.com/ignas-sakalauskas/CustomAuthenticationNetCore20/tree/master/CustomAuthNetCore20/Authentication
但也有略微不同,总之就是,原先的验证方式有点类型说Session这种,如果用户一段时间不访问就会失效,需要一直客户端一直要向服务器端发送心跳连接,保持登录状态。
后来,因为API接口需要为微信端(其实就是几个移动端页面)提供服务,就另外引用了JwtBearer授权方式。
Token 发放没有使用IdentityServer4,就是简单的用用户名和密码换取一个Token,也没有让Token过期的操作。
发放Token代码如下
ConfigureServices 配置如下
api方法授权如下
现在遇到一个问题,在本地调试环境,工作一切正常。但在服务器环境中。Token只有在重启系统开始后的2分钟左右能验证成功,后面就一直验证不成功,新获取的Token也不能验证。
我把日志记录等级调到最低了,使用AddJwtBearer (Microsoft.AspNetCore.Authentication.JwtBearer)验证也没有打印到任何错误或验证不通过的信息。而且可以明确看到,请求的目标方法已经显示指定了 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
应该和原来的自定义方法无关了,但好像从结果看,它好像还是受自定义的(Custom)的,而且,日志也打印了Custom验证失败的信息。
在配置文体已经配置不验证 Token 的 Issuer 和 Audience了。
ValidIssuer = jwtSettings.Issuer, //false
ValidateIssuer = jwtSettings.ValidateIssuer,
//颁发给谁
ValidAudience = jwtSettings.Audience, //false
ValidateAudience = jwtSettings.ValidateAudience,
是不是你在http请求里放的token不对呀,建议在验证token的地方写日志打印token出来检查下。
如果是http请求放置的token不对,一开始就应该验证通不过。就是没找到内置的AddJwtBearer(Microsoft.AspNetCore.Authentication.JwtBearer)怎么打印日志,我把日志打印等级调到最低,连验证失败这种基本信息都没有输出。