首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >利用JWT实现Asp.net网络应用程序接口的身份认证

利用JWT实现Asp.net网络应用程序接口的身份认证
EN

Stack Overflow用户
提问于 2014-05-15 17:42:59
回答 3查看 42.8K关注 0票数 56

我一直在读有关JWT的文章。

但据我所知,它不是一种身份验证机制,而更像是身份验证机制中的一个关键组件。

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

我想在移动应用程序使用的ASP.NET web API2上实现它。

因此,第1步:

  1. 应用程序=>服务器:登录(用户,JWT =>应用程序:登录OK,这是您的JWT
  2. 应用程序=>服务器:获取我的配置文件(发送JWT请求)服务器,然后解密JWT并确定请求身份。

这只是我的理解,看,我可能走上了一条完全错误的道路。

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

我只想使用JWT来识别用户是谁。然后,我将授权后,我已经验证了他们。据我所知,新的MVC和身份验证和授权有很大的混淆。

所以我的问题归结起来就是。

如何使用JWT安全有效地实现身份验证机制?我不想只是吐出一些看起来有效的东西,而对其安全影响一无所知。我确信有一个来源可能设计了一种安全的机制来满足我的需求。

我的要求是:

  • 必须在每个会话中只检查一次数据库中的用户凭据吗?由于使用了bcrypt,使用了大量的资源进行比较,passwords.
  • Must能够从他们的请求中识别出用户。(即,他们是谁,userId就足够了),并且对于处理请求的服务器端的资源而言,
  • 应该尽可能低的开销,并且最好不访问DB。
  • 如果入侵者必须复制设备之前的请求,那么他应该无法访问真正的用户数据。(显然)

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-15 19:48:40

你对JWTs的理解很好。但这里有一些更正和一些建议。

身份验证和授权

  • JWTs与身份验证无关。只有当您在创建JWT时进行身份验证时,才会命中数据库和散列密码。这与JWTs是正交的,你可以用任何你喜欢的方式来做。我个人喜欢JWT,它也有一个使用JWTs.
  • Theoretically,的很好的例子,你可以让用户每年输入一次密码,并让Membership Reboot全年有效。这很可能不是最好的解决方案,如果JWT在任何时候被窃取,用户的资源都会受到损害。

加密

  • 令牌可以加密,但不必加密。加密令牌将增加系统的复杂性和服务器读取JWTs所需的计算量。如果您要求在令牌处于静止状态时没有人能够读取它,那么这一点可能很重要。
  • 令牌始终由颁发者进行加密签名,以确保其完整性。这意味着它们不能被用户或第三方篡改。

索赔

你的JWTs可以包含你想要的任何信息。用户名、生日、电子邮件等。您可以使用基于声明的授权来执行此操作。然后,您只需告诉您的提供者使用这些来自claims原则的声明来创建JWT。下面的代码来自Membership Reboot示例,它向您展示了如何做到这一点。

代码语言:javascript
复制
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's OAuth Authorization Server。它为您提供了为您的应用程序接口创建OAuth服务器所需的基础知识。

你也可以看看Thinktecture的Identity Server,它可以让你更容易地控制用户。例如,您可以使用identity Server轻松地实现刷新令牌,其中用户只需进行一次身份验证,然后在一段时间内(可能是一个月),他们可以继续从Identity server获取短期的JWTs。刷新令牌是好的,因为它们可以被撤销,而JWT不能。此解决方案的缺点是,您需要设置另一个或两个服务器来托管身份服务。

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

如果您要保护极其敏感的内容,则应将令牌的生存期保持在非常短的时间窗口内。如果你在保护一些不太敏感的东西,你可以让它的生命周期更长。令牌有效的时间越长,如果用户的机器被攻破,攻击者必须假冒经过身份验证的用户的时间窗口就越长。

票数 56
EN

Stack Overflow用户

发布于 2014-10-30 05:10:05

我写了一篇关于配置OWIN授权服务器以颁发签名的JSON Web令牌而不是默认令牌的详细博客文章。因此,资源服务器(受众)可以向授权服务器注册,然后它们可以使用由令牌颁发者方颁发的JWT令牌,而不需要在各方之间统一machineKey值。你可以阅读这篇文章的JSON Web Token in ASP.NET Web API 2 using Owin

票数 23
EN

Stack Overflow用户

发布于 2020-09-17 09:51:17

对于正式的概念。身份验证是验证用户身份的过程,而授权是验证用户有权访问哪些内容的过程。

让我们看看现实生活中的例子

想象一下,你的邻居让你在他不在的时候给他的宠物喂食。在本例中,您有权访问厨房并打开存储宠物食品的橱柜。然而,你不能进入你邻居的卧室,因为他没有明确允许你这样做。即使你有进入房子的权利(身份验证),你的邻居只允许你进入某些区域(授权)。

有关更详细的信息,以及对于喜欢更多的用户,请逐步实现,了解如何在Web API中实际使用JSON WEB Token。这是必须阅读的帖子Secure WebAPI Using JSON WEB TOKEN

更新为使用: System.IdentityModel.Tokens.Jwt -Version 5.1.4

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23674613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档