【问题标题】:How to Prevent Man in Middle Attack & session hijacking attack in .NET Core 3.1如何在 .NET Core 3.1 中防止中间人攻击和会话劫持攻击
【发布时间】:2021-11-03 11:47:33
【问题描述】:

我正在使用 IdentityServer4(.NET Core 3.1) 进行身份验证(OIDC 协议)。但是过期会话的过去会话 id 可用于在应用程序中获取身份验证,因为我的应用程序容易受到会话重放/会话 Hjijacking/Man in Middle 攻击。

请分享一些针对此漏洞的解决方案。

【问题讨论】:

  • MITM 保护由 SSL 提供。至少使用 TLS1.2 并且不要禁用证书验证。为什么您认为您的应用程序在任何方面都存在漏洞?这是一个真正的问题,还是您正在尝试解决某些顾问报告的问题?为什么您的应用程序和 Identity Server 会完全接受 过期 会话 ID?
  • 感谢您的快速回复@PanagiotisKanavos。我不认为这个问题是由具有适当证据的安全顾问报告的。并且服务器正在接受我这是问题所在。他们还建议“添加一个为每次登录尝试随机更改的新 cookie。在身份验证之前和之后生成不同的会话 id。此外,成功身份验证后的每个请求都应该与一个额外的会话标识符 cookie 相关联,该 cookie 也会随机更改和过期当用户从应用程序注销或关闭浏览器时。
  • 您描述的是默认行为,closes the browser 除外。这并不意味着会话以任何方式关闭。 HTTP 是一种无状态协议,因此无法知道浏览器是否关闭。 client 代码需要明确要求退出,服务器会关闭问题作为响应。这就是所有网站的工作方式。会话过期以处理崩溃、断开连接或仅关闭浏览器而不注销的用户。许多网站都有在浏览器关闭时发送注销请求的脚本,但不能保证服务器会收到它。

标签: asp.net-core identityserver4 openid-connect asp.net-core-3.1


【解决方案1】:

如果我们谈论的是能够使用旧的(但仍未过期的)cookie,那么一种缓解方法是将会话的持久性移至后端。默认情况下,cookie 类似于现金,我们希望它更像借记卡。

ASP.Net Core 的标准身份验证 cookie 中间件支持为 cookie 有效负载(即声明)实现后端存储机制。这意味着您可以在服务器端使会话无效(通过删除包含该数据的记录)并使任何其他有效的 cookie 在野外无法使用。查看CookieAuthenticationOptions.SessionStoreITicketStore 接口。最终结果是一个仅保存会话 ID 和到期时间的 cookie,该 cookie 仍可通过正常的 .Net Core 数据保护 API 防止被篡改。

如果是不记名令牌(即由 IdentityServer4 发布的访问令牌 JWT),那么最好的缓解措施是使用短期访问令牌或切换到使用引用令牌并确保它们在适当时自动撤销。

尽管后端存储并不能解决所有问题 - 正如@Panagiotis Kanavos 指出的那样,如果用户没有明确退出,那么陈旧的会话可能会四处飘荡。

保持 cookie 的生命周期较短并使用滑动到期会有所帮助,因为这意味着静态 cookie 仍然可用的机会较低,但可能是一个不错的 UX 折衷,因为它不需要用户以交互方式重新进行身份验证,因此经常。

此外,使用后端存储意味着您可以根据其他数据更改使会话无效 - 例如如果用户更改了密码或其他安全设置。您还可以通过删除所有会话和刷新令牌来实现“在所有设备上退出”选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2020-10-03
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2015-09-15
    相关资源
    最近更新 更多