【发布时间】:2019-05-29 08:07:29
【问题描述】:
我在 IIS 后面的服务器中部署了一个 ASP.NET 核心 REST API。 REST API 由 Angular JS Web 应用程序和移动(Android/IOS)应用程序使用。对于授权,我使用的是 JWT token()。最近通过安全审计,他们发现存储在本地存储中的 JWT 可以被同一组织的其他攻击者窃取并用于冒充(例如,员工利用经理的功能)。
我想将这个人或那台机器标记到那个 JWT 上,这样当 JWT 被盗时,攻击者就不能滥用它或者不会对那个被盗的 Token 进行任何使用。我尝试使用 JWT 令牌标记 IP 并将这些查找存储在服务器中(在内存缓存中)。下面是我试过的代码,没用。
private readonly IHttpContextAccessor _httpContextAccessor;
public TestController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
var ipAddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
我希望每次我从不同的机器请求时输出都会有所不同。但是每次像 15.11.101.25 这样的实际输出都是相同的 IP(尽管我从不同的机器上尝试过)。如果有的话,请与我分享一些更好的解决方案。请原谅我的英语。
【问题讨论】:
-
好吧,如果您使用代理或公共互联网连接,那么所有 IP 都相同是正常的。您应该从移动设备(未通过 WLAN 连接)尝试。另外,被盗代币与 CSRF 有什么关系? CSRF 发生在攻击者伪造链接(或页面上的表单并引诱您访问它,因此发送隐藏表单)时。使用 JWT 就不会发生这种情况,CSRF 仅容易受到 Cookie 身份验证,因为浏览器会自动将 cookie 与请求一起发送,而 JWT 不会发生这种情况
-
CSRF 无法从本地存储中获取令牌,这只能通过 XSS(跨站点脚本)实现,当有人设法将一段 JavaScript 代码注入您的网站时(当您没有正确清理您的用户输入)。此外,员工获得经理 JWT 令牌的情况也不太可能,除非 a)他们可以物理访问经理计算机(然后您的公司有其他更大的问题)或 b)用户可以将 javascript 代码注入网站并让经理打开它,在这种情况下,您与员工之间存在严重的信任问题
-
@Tseng 我们可以从移动设备尝试。但问题是它也应该适用于 Web。很抱歉将这个问题转移到 CSRF。主要问题是我应该避免用户 B 窃取用户 A 的令牌,这样用户 B 就不能冒充用户 A。
-
我的意思是,如果同一家公司的所有用户都有相同的IP(他们通过一个互联网连接共享相同的公共IP),使用IP作为鉴别器是没有意义的
-
@Tseng :我向我们的安全专家提到了完全相同的事情(“员工不太可能获得经理 JWT 令牌,除非他们可以物理访问经理的计算机)。但他们还没有准备好听. 所以需要找到一些解决方案来标记它。他们希望这个应用程序表现得像传统的会话概念。就像每个会话都是不同的,一个人不能窃取其他会话。为了争论,如果黑客攻击应用程序,我仍然可以争论设法获得了 Session cookie。但安全团队还没有准备好进行任何辩论。
标签: angularjs asp.net-core mobile asp.net-core-webapi asp.net-core-security