使用 Blazor WASM 进行身份验证和授权的正确方法是什么

问题描述 投票:0回答:1

所以我最近对 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,但我不确定。

authentication jwt authorization asp.net-core-webapi blazor-webassembly
1个回答
0
投票

我们可以设置Cookie来存储令牌,尽管这通常不是一个好的做法,但该应用程序仅在内部网络中可用。我找到了一个链接,它解释了为什么我们不存储在浏览器中。

在我看来,Blazor WSAM(独立且无托管后端)是 SPA,使用 jwt 身份验证对于您的结构来说是一个不错的选择,但我们最好将访问令牌和刷新令牌存储在内存数据库(如 Redis、CosmosDb)中它可以在性能和安全性之间取得很好的平衡,数据库中的存储应该匹配大部分结构,从而带来高可用性。

同时,迁移到云端是趋势,这样我们也可以使用开箱即用的解决方案,例如Azure Entra(Azure AD)、Google云等,然后认证和授权都由云端管理服务,我们不需要担心安全和维护问题。

© www.soinside.com 2019 - 2024. All rights reserved.