当前位置: 首页 > 知识库问答 >
问题:

在ASP.NET web API上使用JWT实现身份验证

岑经纶
2023-03-14

我一直在读关于智威汤逊的文章。

但从我读到的内容来看,它不是一种身份验证机制,而更像是身份验证机制中的一个关键组件。

我目前已经实现了一个可以工作的解决方案,但这只是为了试用JWT并看看它是如何工作的。但我现在所追求的是一个人应该如何利用它。根据我的经验,它基本上只是一个加密机制,给你一个唯一的加密密钥。您还可以将信息放入此令牌中。

我希望在ASP.NET web API2上实现它,以供移动应用程序使用。

所以第一步:

  1. app=>服务器:登录(用户,密码)
  2. 服务器=>app:Login OK,这是您的JWT
  3. app=>server:获取我的配置文件(发送带有请求的JWT)服务器,然后解密JWT并确定请求标识。

这只是我对它的理解,听着,我可能走错了路。

JWT的理想状态是不是使您不必对每个请求进行身份验证?我只需要对用户的凭据进行一次身份验证(在初始登录时),然后服务器就可以简单地使用JWT,而不必在DB中查找用户pw和user?

我只想使用JWT来标识用户是谁。我将授权后,我已验证他们。据我所知,新的MVC和身份验证与授权存在很大的混淆。

所以我的问题归结为。

如何使用JWT安全有效地实现身份验证机制?我不想只是说出一些似乎有效的东西,而对安全影响没有任何想法。我确信有一个来源,一些地方,可能已经设计了一个安全的机制,将满足我的要求。

我的要求是:

  • 每个会话只需检查db中的用户凭据一次?由于使用bcrypt使用了大量资源来比较密码。
  • 必须能够根据用户的请求识别用户。(即他们是谁,userId就足够了),最好也不访问DB
  • 对于服务器端处理请求的资源,
  • 的开销应该尽可能低。
  • 如果入侵者必须复制设备之前的请求,那么他应该无法访问真实用户的数据。(显然)

谢谢

共有1个答案

督俊雅
2023-03-14

null

  • JWT与身份验证无关。只有在创建JWT时进行身份验证时,才会使用DB和散列密码。这与JWTs正交,您可以用任何您喜欢的方式来实现。我个人喜欢成员身份重启,它也有一个使用JWTS的好例子。
  • 理论上,您可以让用户每年输入一次密码,并使JWT在该年全年有效。这很可能不是最好的解决方案,如果JWT在任何时候被盗,用户的资源都会受到损害。
  • 令牌可以加密,但不必加密。加密令牌将增加系统的复杂性和服务器读取JWTS所需的计算量。如果您要求在令牌处于静止状态时没有人能够读取该令牌,这可能很重要。
  • 令牌始终由发行方进行加密签名,以确保其完整性。这意味着用户或第三方不能篡改它们。

您的JWT可以包含您想要的任何信息。用户的姓名、出生日期、电子邮件等。您可以使用基于声明的授权来完成此操作。然后,您只需告诉您的提供者根据claims原则用这些claims创建一个JWT。下面的代码来自该成员资格重新启动示例,它向您展示了如何完成此操作。

public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var svc = context.OwinContext.Environment.GetUserAccountService<UserAccount>();
    UserAccount user;
    if (svc.Authenticate("users", context.UserName, context.Password, out user))
    {
        var claims = user.GetAllClaims();

        var id = new System.Security.Claims.ClaimsIdentity(claims, "MembershipReboot");
        context.Validated(id);
    }

    return base.GrantResourceOwnerCredentials(context);
}

这允许您精确地控制谁正在访问您的资源,而不需要访问您的处理器密集型身份验证服务。

实现令牌提供程序的一个非常简单的方法是在您的WebAPI项目中使用Microsoft的OAuth授权服务器。它提供了为API制作OAuth服务器所需的基本内容。

您还可以查看ThinkTecture的身份服务器,这将使您更容易地控制用户。例如,您可以很容易地使用identity server实现刷新令牌,在该服务器中用户只进行一次身份验证,然后在一定时间内(可能一个月),他们可以继续从identity server获得短期JWT。刷新令牌很好,因为它们可以被撤销,而JWT则不能。这种解决方案的缺点是您需要设置另一个或两个服务器来托管身份服务。

为了解决最后一个问题,即入侵者不应该能够复制最后一个请求来访问资源,您必须至少使用SSL。这将保护传输中的令牌。

如果保护的是极其敏感的东西,则应将令牌生存期保持在一个非常短的时间窗口内。如果你保护的是不那么敏感的东西,你可以延长寿命。如果有效的话,标记越长,如果用户的计算机受到攻击,攻击者必须模拟已验证的用户的时间窗口就越大。

 类似资料:
  • 注意:我的问题与Spring-Boot REST API+web应用程序的安全性有关。

  • 我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web Tokens进行身份验证。以下是有效且安全的实现吗? < li >将开发一个REST API来接受用户名和密码并进行认证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还会有安全SSL < li >在认证时,将创建两个JWTs访问令牌和刷新令牌。刷新令牌将具有更长的有效期。这两个令牌都将写入coo

  • 我正在使用SpringBoot开发具有微服务架构的Rest Backend。为了保护endpoint,我使用了JWT令牌机制。我正在使用Zuul API网关。 如果请求需要权限(来自JWT的角色),它将被转发到正确的微服务。Zuul api网关的“WebSecurityConfigrerAdapter”如下。 这样,我必须在这个类中编写每个请求授权部分。因此,我希望使用方法级安全性,即“Enabl

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 本文向大家介绍Angular之jwt令牌身份验证的实现,包括了Angular之jwt令牌身份验证的实现的使用技巧和注意事项,需要的朋友参考一下 Angular之jwt令牌身份验证 demo https://gitee.com/powersky/jwt 介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该toke

  • 在身份验证等情况下,与会话相比,使用JWTs有什么优势? 它是作为独立方法使用还是在会话中使用?