在 ASP.NET Core 2.1 Web 客户端中存储不记名令牌的位置

Posted

技术标签:

【中文标题】在 ASP.NET Core 2.1 Web 客户端中存储不记名令牌的位置【英文标题】:Where to store bearer token in ASP.NET Core 2.1 web client 【发布时间】:2018-12-06 21:40:03 【问题描述】:

我正在编写一个三级应用程序。我有 ASP.NET Core 2.1 Api、Web 客户端应用程序和 android 应用程序。 Api 受 Jwt 授权保护。我在存储从 Api 获取的令牌到 Web 客户端时遇到问题。为此,我需要一种安全的方式,我正在考虑将其存储在ClaimsIdentity 中是否是一种好方法。我将在此处添加它:

var claims = new List<Claim>

    new Claim(ClaimTypes.NameIdentifier, token.userId),
    new Claim(ClaimTypes.Name, token.userName),
    // Here add new Claim(ClaimTypes.Authentication, token.token)
;

var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);

await HttpContext.SignInAsync(principal);

这是正确且安全的方式吗?

【问题讨论】:

您反对使用 Localstorage 存储不记名令牌的想法吗? 我发现了类似 Secret Manager docs.microsoft.com/pl-pl/aspnet/core/security/… 的东西,但正如微软所说,它仅用于开发目的而不是生产目的。所以这不是一个好主意。也许我应该使用 Cookie 或 Session 变量? ClaimTypes.Authentication 可能不是这个地方 - 请参阅the docs。您可以添加自己的自定义声明,例如 new Claim("access_token", token.token) - 如果您采用这种方法,请确保您设置了 httponly 和安全标志。 auth0 有一些指导here 【参考方案1】:

我终于找到了可以使用的东西。

https://hanssens.com/projects/localstorage

您可以使用此组件在内存中存储大量数据。它还具有加密模式,因此应该非常安全。再次感谢您的帮助!

【讨论】:

html5 Web 存储易受 XSS 攻击,具有较大的攻击面,并且可以影响所有应用程序用户成功攻击。您可以阅读这篇文章,stormpath.com/blog/…,其中讨论了 XSS 和 CSRF 攻击。 这个用户是特定的吗?我有一个从 REST Web 服务获取 JWT 令牌的 .net core 2.0 客户端。我希望令牌仅用于我当前的用户。还有另一种方法吗?谢谢【参考方案2】:

我在 ASP.NET Core 2.1 中使用了 JwtBearer 授权 将其与手机连接....

我存储在前端的令牌... 比如手机……我把它存储在设置文件中……打开应用程序后 我检查该值是否存在或为空

如果存在...使用它发出请求 if Null ...请求一个新的令牌

在网络中...您可以将其存储在本地存储或 cookie 中

【讨论】:

您好,感谢您的回复。在 Android 中,您可以将其存储在例如数据库中。但是在 ASP 中它是不安全的

以上是关于在 ASP.NET Core 2.1 Web 客户端中存储不记名令牌的位置的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.1 MVC - 无法设置从 Web api 响应接收到的 cookie

如何在 ASP.NET Core 2.1 中获取客户端 IP 地址

在 ASP.NET Core 2.1 Web API 中实现分页

Asp.net core 2.1 Web App 无法在 IIS 上正确呈现

ASP.Net Core 2.1 和 IHttpClientFactory 中的 Flurl 客户端生命周期

如何在 asp.net core 2.1 中使用 net.tcp 服务