为网站制定一个推广计划,做网站的网址怎么弄,iis7新建网站,企业软件定制开发【导读】JWT认证方式目前已被广泛使用#xff0c;一直以来我们将token放在请求头中的Authorization中#xff0c;若通过此种方式#xff0c;一旦token被恶意窃取#xff0c;攻击者可肆意对用户可访问资源进行任意索取我们大多都是通过登录成功后#xff0c;响应AccessToke… 【导读】JWT认证方式目前已被广泛使用一直以来我们将token放在请求头中的Authorization中若通过此种方式一旦token被恶意窃取攻击者可肆意对用户可访问资源进行任意索取我们大多都是通过登录成功后响应AccessToken然后由前端将token存储在相关Storage中然后每次将其放请求头而认证请求由于token是极其敏感信息所以我们不能将其交由前端去处理而应由后台获取对前端不可见对安全有较高要求的平台我们通过Http Only Cookie来解决token恶意窃取问题Http Only CookieHttp Only Cookie简言之则是将相关信息响应时存储在Cookie中而客户端脚本无法访问每次请求时则将自动携带所有信息到服务器。例如京东存储相关信息接下来我们看看在.NET Core中如何将AccessToken以Http Only方式存储在Cookie中[AllowAnonymous]
[HttpGet(api/test/get)]
public IActionResult Get()
{Response.Cookies.Append(x-access-token, GenerateToken(),new CookieOptions(){Path /,HttpOnly true});return Ok();
}如上我们模拟登录成功并不返回AccessToken而是将其写入到响应头中上述Cookie选项HttpOnly为true即表示客户端脚本不可访问此时我们来访问如下需认证接口[HttpGet(api/test/say)]
public string Say()
{return Hello World;
}用过JWT的童鞋都知道标准模式则是将AccessToken写入到Authorization中即请求头【Authorization: Bearer ......】那么上述是如何认证成功而请求到接口的呢当我们添加JWT认证时每次请求在其对应事件OnMessageReceived中将自动获取请求头Authorization中的值将其赋值给context.Tokenservices.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options
{......options.Events new JwtBearerEvents{OnMessageReceived context {//Bearer Tokencontext.Token ; return Task.CompletedTask;}};
});你问我是怎么知道的我是猜的吗当然不是丢出官方源码就知道了直接找到JWT如何处理认证则一目了然protected override async TaskAuthenticateResult HandleAuthenticateAsync()
{string token null;// Give application opportunity to find from a different location, adjust, or reject tokenvar messageReceivedContext new MessageReceivedContext(Context, Scheme, Options);// event can set the tokenawait Events.MessageReceived(messageReceivedContext);if (messageReceivedContext.Result ! null){return messageReceivedContext.Result;}// If application retrieved token from somewhere else, use that.token messageReceivedContext.Token;if (string.IsNullOrEmpty(token)){string authorization Request.Headers[HeaderNames.Authorization];// If no authorization header found, nothing to process furtherif (string.IsNullOrEmpty(authorization)){return AuthenticateResult.NoResult();}}.......
}到这里我们知道了自动获取Token的原理我们修改了Token存储方式照葫芦画瓢就好如此将覆盖默认标准模式如下OnMessageReceived context
{var accessToken context.Request.Cookies[x-access-token];if (!string.IsNullOrEmpty(accessToken)){context.Token accessToken;}return Task.CompletedTask;
}从分析自动获取Token原理我们也可知道若与第三方对接依然可以使用请求头Authorization标准模式认证因为Cookie为空再次获取Authorization值注意发现若将前端未置于wwwroot下即完全前后分离涉及到跨域的情况下比如使用的是axios封装请求那么应该必须在请求头中添加【withCredentials:true 】否则使用Http Only将无效出现401额外意外发现一个很有意思的问题未深入研究这里当做小知识了解下就好或许是我自以为发现新大陆了呢当我们创建AccessToken时都会设置一个过期时间我们知道此过期时间肯定不会设置过长但是若在比如移动端微信小程序中若设置时间不长必然要考虑刷新Token问题为了懒一点我们将Token设置为永不过期那么JWT支持吗当然支持只不过根据我刚好尝试了几次找到了JWT永不过期的上限最大只能是16年若超过此临界点比如17年如下将会出现401具体错误如下了解了解就好也没啥鸟用我也是经常会瞎想比如考虑某些可能存在的极限情况