小编Emi*_*las的帖子

访问令牌和刷新令牌最佳实践?如何实施访问和刷新令牌

我正在制作 SPA,并决定使用 JWT 进行身份验证/授权,并且我已经阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本令牌授权的工作原理。问题是,我看不到刷新令牌如何适应它,在我看来它降低了安全性。让我解释一下,正如我所看到的:

Cookie 方法

当您通过用户名和密码对用户进行身份验证时,您将创建与该用户关联的会话 ID。并将其设置为 cookie,每次客户端调用您的服务器时,它都会发送该 cookie,服务器可以在数据库或其他服务器端存储中查找关联用户。

  • 这种方法容易受到 CSRF (Cross Site Request Forgery) 的攻击 为防止 CSRF 您可以使用带有 cookie 的令牌

  • 服务器还需要不断地查找存储,以查看 cookie 指向哪些用户。

代币方式

当您通过用户名和密码对用户进行身份验证时,您将创建一个签名令牌,在有效负载中包含到期日期、电子邮件地址或用户 ID、角色等。对于安全令牌,应具有较短的到期时间。令牌可以存储在本地存储、会话存储、cookies 的任何地方。我将使用本地存储或会话存储来防止 XSRF。

  • 这容易受到 XSS(跨站点脚本)的攻击,但您可以通过验证 HTML 输入来防止这种情况发生。
  • 由于令牌生命周期短,当令牌过期时,用户必须重新登录。

访问令牌和刷新令牌

所以我想使用刷新令牌来防止用户需要不断登录。所以让我们说一下身份验证,我给用户访问令牌和刷新令牌,当用户访问令牌过期时,用户可以使用刷新令牌来获取新的访问令牌,这是我没有得到的。

  • 假设我将访问令牌存储在本地存储中。如果我还在本地存储中存储 Refresh 令牌,我看不到它有任何用处。因为如果攻击者可以访问本地存储并获得访问令牌,他也可以获得刷新令牌。所以在这种情况下,为什么不让访问令牌长寿命。
  • 如果您将 Refresh 令牌存储为 cookie,它很容易受到 XSRF 的攻击,然后攻击者可以获得新的访问令牌,并使用它。同样在这一点上,为什么不直接使用 Cookie 授权?因为您已经必须查找本地存储以获取刷新令牌,尽管与纯 cookie 授权相比,这种情况发生的频率较低。

最佳做法是什么?

目前我正在考虑使用:

  • 访问令牌(本地存储,短暂的)
  • 刷新令牌(Cookie,长寿)
  • 刷新令牌的令牌(为了防止 XSFR,本地存储,使用一次后过期)

假设它看起来像这样:

  +--------+                                           +---------------+
  |        |------------ Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<--------------- Access Token …
Run Code Online (Sandbox Code Playgroud)

security cookies authorization token

15
推荐指数
1
解决办法
3480
查看次数

Blazor 页面和 razor 页面内的组件代码?(西装外套图案)

在 razor 页面中处理 Blazor 时是否有一些特定的代码编写模式?我看到有关 Blazor 的所有示例都将 HTML/Razor/CSS 和 C# 代码放在同一个文件中,例如:

<div class="text">@sometext</div>

<style> .text{ color:black; } </style>

@code{
   sometext = "text.."
}
Run Code Online (Sandbox Code Playgroud)

是否有某种模式可以像 MVC 一样将 C# 和 HTML 分开?我将@code{}页面的大部分逻辑移至单独的服务类。

我有兴趣听到不同的方法,最佳实践是什么?

c# .net-core blazor

5
推荐指数
1
解决办法
3421
查看次数

如何从控制器进行 HTTP 调用?使用 Web API 的 Asp.Net Core C#

我想对各种服务进行 HTTP 调用,POST/GET/DELETE..,并读取响应 JSON 和 XML,如何在服务器端的 C# 中执行此操作?

简而言之:如何从 Asp.Net Core C# 进行 Api 调用。

客户端 Ajax 不起作用,(对于跨域)

c# api asp.net-core-mvc asp.net-core

2
推荐指数
2
解决办法
2万
查看次数

将数据库上下文注入自定义属性 .NET Core

我正在创建 ASP.NET Core 3.1 应用程序,使用 SPA 作为前端。所以我决定创建自定义身份验证和授权。因此,我创建了自定义属性来发出和验证 JWT。

可以说它看起来像这样:

[AttributeUsage(AttributeTargets.Method)]
public class AuthLoginAttribute : Attribute, IAuthorizationFilter
{
    public async void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        //Checking Headers..            
            
        using (var EF = new DatabaseContext)
        {
            user = EF.User.Where(p => (p.Email == username)).FirstOrDefault();
        }
        filterContext.HttpContext.Response.Headers.Add(
            "AccessToken",
            AccessToken.CreateAccessToken(user));
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,但我的DatabaseContext,看起来像这样:

public class DatabaseContext : DbContext
{        
    public DbSet<User> User { get; set; }      
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySQL("ConnectionString");
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //....
    }
}
Run Code Online (Sandbox Code Playgroud)

我想从 Appsettings.json …

attributes dependency-injection entity-framework-core asp.net-core

2
推荐指数
1
解决办法
4241
查看次数

Javascript React 可以将 HttpOnly cookie 发送到服务器吗?

您可以使用 fetch 或通过其他方式将带有 HttpOnly cookie 的请求发送到 React 中的服务器吗?

我知道 HttpOnly 意味着您无法使用 JS 访问它。我在想,也许你看不懂,但你可以寄回去吗?我不知道。

我要这个:

  • 从客户端(ReactJS SPA)向服务器发出请求
  • 服务器响应并设置 HttpOnly Cookie。
  • 客户端得到响应,cookie 由浏览器自动设置。

对于同一台服务器的新请求,我想发回那个 cookie。这可以使用 ReactJS 吗?或者也许有一些方法可以绕过它,比如用简单的 HTML 而不是 ReactDOM 打开新窗口?

谢谢你的帮助。

cookies httponly reactjs

2
推荐指数
1
解决办法
2401
查看次数