所以我最近对 SPA 很感兴趣,而我最感兴趣的是 Blazor WASM。
这个想法是创建一个 API,它生成 JWT 令牌,并在成功登录时将其作为 httpCookie 发送回来(因为显然,由于安全原因,将其发送回响应并将其存储在 localStorage 中是世界上最糟糕的事情( XSS))
所以我决定建立一个项目以及一个 Web API,然后我继续制作一个注册/登录页面。 当用户登录时,如果登录成功,API 会从端点发送回包含 JWT 令牌的 httpCookie。
[AllowAnonymous]
[HttpPost("Login")]
public IActionResult Login([FromBody] AccountLoginModel model)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
var user = Authenticate(model);
if (user == null)
return NotFound();
var token = GenerateToken(user);
// Set the token in a secure HttpOnly cookie
HttpContext.Response.Cookies.Append(
"access_token",
token,
new CookieOptions
{
HttpOnly = true,
Secure = false,
SameSite = SameSiteMode.None,
Expires = DateTimeOffset.UtcNow.AddMinutes(5)
});
return Ok();
}
我注意到 cookie 不会出现在开发工具中,所以我开始谷歌搜索,发现一个页面,上面写着“由于 Blazor WASM 是客户端应用程序,它无法存储 httpCookie”或类似的内容.
这让我陷入了困境,试图找到一种设置身份验证和授权的好方法。
在我看来,每个解决方案都过于复杂,并且需要大量的工作来设置。
我应该将其存储在 localStorage 中并希望得到最好的结果,还是唯一可行的选择来穿越沼泽,也称为另一种方式设置基本身份验证?
我尝试通过谷歌搜索找到解决方案,似乎使用带有 cookie 的 JWT 不适用于 Blazor WASM,但我不确定。
我们可以设置Cookie来存储令牌,尽管这通常不是一个好的做法,但该应用程序仅在内部网络中可用。我找到了一个链接,它解释了为什么我们不存储在浏览器中。
在我看来,Blazor WSAM(独立且无托管后端)是 SPA,使用 jwt 身份验证对于您的结构来说是一个不错的选择,但我们最好将访问令牌和刷新令牌存储在内存数据库(如 Redis、CosmosDb)中它可以在性能和安全性之间取得很好的平衡,数据库中的存储应该匹配大部分结构,从而带来高可用性。
同时,迁移到云端是趋势,这样我们也可以使用开箱即用的解决方案,例如Azure Entra(Azure AD)、Google云等,然后认证和授权都由云端管理服务,我们不需要担心安全和维护问题。