httponlycookie保护accesstoken

dotNET跨平台 dotNET跨平台     2023-01-12     235

关键词:

【导读】JWT认证方式目前已被广泛使用,一直以来我们将token放在请求头中的Authorization中,若通过此种方式,一旦token被恶意窃取,攻击者可肆意对用户可访问资源进行任意索取

我们大多都是通过登录成功后,响应AccessToken,然后由前端将token存储在相关Storage中,然后每次将其放请求头而认证请求,由于token是极其敏感信息,所以我们不能将其交由前端去处理,而应由后台获取对前端不可见

对安全有较高要求的平台,我们通过Http Only Cookie来解决token恶意窃取问题

Http Only Cookie

Http 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.Token

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>

   ......
   options.Events = new JwtBearerEvents
    
        OnMessageReceived = context =>
        
          //Bearer Token
          context.Token = "";  
          return Task.CompletedTask;
        
    ;
);

你问我是怎么知道的,我是猜的吗,当然不是,丢出官方源码就知道了,直接找到JWT如何处理认证则一目了然

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()

    string token = null;

    // Give application opportunity to find from a different location, adjust, or reject token
    var messageReceivedContext = new MessageReceivedContext(Context, Scheme, Options);

    // event can set the token
    await 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 further
      if (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,具体错误如下:

了解,了解就好,也没啥鸟用,我也是经常会瞎想,比如考虑某些可能存在的极限情况

hostonlycookie和httponlycookie

怎么使用Cookie?  通常我们有两种方式给浏览器设置或获取Cookie,分别是HTTPResponseHeaders中的Set-CookieHeader和HTTPRequestHeaders中的CookieHeader,以及通过JavaScript对document.cookie进行赋值或取值。rfc6265第5.2节定义的Set-CookieHeader,除了必... 查看详情

您究竟如何在 ASP.NET 中配置 httpOnlyCookies?

】您究竟如何在ASP.NET中配置httpOnlyCookies?【英文标题】:HowexactlydoyouconfigurehttpOnlyCookiesinASP.NET?【发布时间】:2010-09-0704:56:46【问题描述】:受这篇CodingHorror文章“ProtectingYourCookies:HttpOnly”的启发你如何设置这个属性?网络配置... 查看详情

如何使用存储在httponlycookie中的令牌注销(代码片段)

...,我只是将其移除到客户端,但现在因为我将令牌存储在HttpOnlycookie中,所以我无法做任何客户端操作。我是否在服务器上调用使用新cookieAUTH进行响应并且值为空的路由?我试过了,但来自logout的响应cookie似乎没有取代HttpOnlycook... 查看详情

Spring Security CookieBasedCSrf 不起作用

...r2前端的RESTfulSpring后端。我将访问令牌(JWT实现)存储在httpOnlyCookie中。为了保护自己免受对post请求的XSRF攻击,我需要在所有页面上启用XSRF保护 查看详情

设置httponlycookie解决mshtml编程无法获取验证码图片流

最近给客户做的项目有一个新需求,客户需要在打开的IE浏览器中做自动登录,登录的页面上有神兽验证码.解决验证码的方案是找第三方平台打码.这样就有一个问题,如何把正确的验证码传给第三方打码平台.大家都知道,验证码是随... 查看详情

httpOnly cookie 中的 JWT - AuthGuard 和受保护的路由(Node.js、Angular)

】httpOnlycookie中的JWT-AuthGuard和受保护的路由(Node.js、Angular)【英文标题】:JWTinhttpOnlycookie-AuthGuardandprotectedroutes(Node.js,Angular)【发布时间】:2020-03-2521:34:43【问题描述】:我正在开发我的应用程序,我正在使用JWT进行身份验证和... 查看详情

httponlycookie怎么讲

...的访问都会被禁止。当然也有前提:使用新版的浏览器。HttpOnlyCookie最初由Microsoft’sInternetExplorer6SP1引入,至今为止,已是设置会话cookie的最佳实践了。其语法如下:在上面的HTTP请求头中,HttpOnly知会浏览器在保存cookie,但不要... 查看详情

哪些浏览器支持 HttpOnly cookie?

】哪些浏览器支持HttpOnlycookie?【英文标题】:WhichbrowsersdosupportHttpOnlycookies?【发布时间】:2010-10-0610:01:13【问题描述】:哪些浏览器支持HttpOnlycookie,从哪个版本开始?有关HttpOnlycookie和XSS预防的讨论,请参阅http://www.codinghorror.c... 查看详情

如何使用 JWT + HttpOnly Cookie 正确刷新令牌?

】如何使用JWT+HttpOnlyCookie正确刷新令牌?【英文标题】:HowtoproperlyrefreshatokenusingJWT+HttpOnlyCookie?【发布时间】:2020-01-2521:01:22【问题描述】:受this文档和this主题的启发,我已经使用JWT+HttpOnlyCookies在我的AspNetCoreAPI应用程序中成功... 查看详情

带有 React 和 Node 的 httpOnly cookie

】带有React和Node的httpOnlycookie【英文标题】:httpOnlycookieswithReactandNode【发布时间】:2021-06-2303:54:34【问题描述】:我正在尝试弄清楚如何使用httpOnlycookie和可扩展性可选性来使用React和Node实现身份验证/授权。我读过JWT可以通过使... 查看详情

httponly是怎么回事?

...么是HttpOnly根据JordanWiens一篇博客《Nocookieforyou!》记载,HttpOnlycookie最初是由MicrosoftInternetExplorer开发人员于2002年在InternetExplorer6SP1的版本中实现。微软开发者网站介绍,HttpOnly是Set-CookieHTTP响应头中包含的附加标志。生成cookie时使... 查看详情

httpcookie与cookie安全

...的安全性关联大一点,配置节如下<httpCookiesdomain="String"httpOnlyCookies="true|false"requireSSL="true|false"/>  httpOnlyCookies:默认是false,作用是是否禁用浏览器脚本访问cookie。在 查看详情

如何测试 httpOnly cookie 标志

】如何测试httpOnlycookie标志【英文标题】:howdoItesthttpOnlycookieflag【发布时间】:2011-05-1800:32:37【问题描述】:我在websphere中为jsessioncookie设置了以下属性com.ibm.ws.webcontainer.HTTPOnlyCookies.知道如何最好地在Firefox或IE中使用JavaScript进... 查看详情

常用中间件 vs 身份验证 api

...服务架构中验证身份验证的最佳方法。发生的情况是jwt在httpOnlycookie中发送到客户端,并保留在登录状态。在每个请求中,cookie都会发送到受保护的RESTapi(微服务)以验证请求/jwt的真实性。可用的两个选项:我 查看详情

HttpOnly cookie 如何处理 AJAX 请求?

】HttpOnlycookie如何处理AJAX请求?【英文标题】:HowdoHttpOnlycookiesworkwithAJAXrequests?【发布时间】:2010-09-0621:04:25【问题描述】:如果在基于cookie的访问限制的站点上使用AJAX,则JavaScript需要访问cookie。HttpOnlycookie可以在AJAX网站上工... 查看详情

Flutter Web httpOnly Cookies 未保存

】FlutterWebhttpOnlyCookies未保存【英文标题】:FlutterWebhttpOnlyCookiesnotsaved【发布时间】:2021-07-2612:51:37【问题描述】:我有一个SpringBootWeb服务器,它为我返回一个httpOnlycookie(带有JWT)以进行身份​​验证。Postman一切都很好。但是... 查看详情

如何在前端使用 HttpOnly jwt cookie

...发布时间】:2021-01-0417:06:26【问题描述】:由于无法读取HttpOnlycookie,如何在前端使用HttpOnlyJWTcookie?从HttpOnlycookie中获取JWT后存储JWT的最佳做法是什么?既然我已经从后端传递了cookie,我还需要将它存储在某个地方吗? 查看详情

在 React 中使用 Httponly Cookie 处理会话

】在React中使用HttponlyCookie处理会话【英文标题】:HandlingSessionswithHttponlyCookiesinReact【发布时间】:2021-02-2121:39:25【问题描述】:当您从React中的HttpOnlycookie获取令牌时,处理用户会话的最佳做法是什么?我的登录端点如下所示,... 查看详情