ASP .NET Core身份验证默认认证与JWT身份验证

23

我正在开发ASP NET Core Web API,但在选择认证方法方面感到困惑。我过去使用默认的Asp Net Identity身份验证,但最近了解了JWT。因此,我已经几乎按照本文中所做的那样实现了身份验证:https://stormpath.com/blog/token-authentication-asp-net-core

但是,我不理解这个JWT的好处。对于简单的Asp Net Identity身份验证,我不关心令牌存储等问题。我只需使用signInManager登录并使用已授权的方法,直到注销。而使用JWT需要考虑令牌存储、到期时间和其他困难。那么,这个JWT有什么好处?我如何存储登录后的JWT令牌?此外,我是否应该使用这个JWT?在我的情况下,我需要一个简单的身份验证,用于将被一个或少数用户使用的简单WebApi。我还听说过OpenIddict、Auth0、IdentityServer,那么所有这些身份验证机制之间有什么区别?

4个回答

18
这是我对此的理解,可以分为三个逻辑部分:
  1. 认证服务器 - 这将验证并发放JWT令牌,当API需要验证令牌时,它会将令牌发送到此服务器以进行验证。
  2. 客户端 - 这是提供您网页或应用程序的内容。这是需要请求和存储JWT令牌的地方。每次客户端请求数据时都需要传递令牌给API。
  3. API - 这是提供信息并需要使用认证服务器验证令牌的地方。

那么,这个JWT有什么好处呢?

JWT被发放给客户端并存储在客户端侧。拥有JWT允许多个客户端(应用程序或网站)使用相同的认证服务器,该服务器分发JWT并说明客户端可以如何使用API。

登录后如何存储此JWT令牌?

我只尝试在使用Angular 2的Ionic 2应用程序中存储它,其中包含一个存储模块。但我很确定已经有很多人这样做并问过这个问题:

ASP.NET Core 1.0 Web API中的简单JWT身份验证

基于令牌的ASP.NET Core身份验证(更新)

更新 如果您的前端纯粹是html/js/css而没有后端来容纳它,则应将令牌存储在本地存储中,有多个npm软件包可以帮助您完成此操作例如这个。您需要寻找Implicit flow。

否则,如果您的前端有一个带有后端的系统,则应将令牌存储在会话/数据库中,您可以选择使用第三方提供商来完成此操作,例如IdentityServer4。您需要使用Hybrid flow

此外,我是否应该使用JWT? 在我的情况下,我需要为一个或少数用户使用的简单WebApi进行简单的身份验证。

由于整个关注点的原因是性能,所以您实际上不需要它,因为只有一个或少量用户。之所以这样做是因为它是一个学习经验,JWT从一开始设置起来并不容易,需要您大量阅读,您会失败并且会感到沮丧,但最终您将知道如何设置它以及它是如何工作的

我也听说过OpenIddict,Auth0,IdentityServer,那么所有这些身份验证机制之间有什么区别呢?

所以您在Stormpath教程中所做的不适用于生产。那只是一个小演示,帮助您了解JWT是什么以及它是如何工作的。上述库是完整的库,可以处理所有重要的事情,无需您从头开始构建整个库。它们之间的主要区别在于它们涵盖的范围不同。

我个人使用了IS4,并且让我哭泣不超过2次(它比我想象的简单): http://identityserver4.readthedocs.io/en/release/

https://github.com/openiddict/openiddict-core

https://auth0.com/docs/quickstart/webapp/aspnet-core/00-intro


谢谢您的回答。所以,如果我决定为一个Web Api使用身份验证,并且该Api需要向另一个Web Api 发送经过身份验证的请求,最好的解决方案是类似于单点登录吗?(例如IdentityServer4、Auth0)? - Andrew K
@AndrewK 客户端将令牌传递给API,该API使用身份验证服务器验证令牌。如果您有多个API,则只需将它们指向同一身份验证服务器,这样多个API /客户端就可以使用单点登录,因为发出的令牌来自单个身份验证服务器。请记住,身份验证服务器不是API。我使用了Identity Server 4,它允许您创建一个身份验证服务器,该服务器可以发出和验证令牌。注意:如果您有1个API调用另一个API,则您正在做错误的事情。 - Anton Toshik
@Anton 我认为 asp.net identity 不使用 sessions,只是将用户声明加密并放入 cookie 中,因此我们不会获得任何性能提升,但是通过使用 tokens,api 服务器必须调用 auth 服务器来验证 token,所以就性能而言,我认为 cookies 更好。 - Lerner
@AntonToshik 但是如何保持这个令牌的持久性?比如用户两天后再次访问您的网站,如果不使用 cookie,她将不得不重新登录。那么这有什么好处呢? - Konrad
1
@lll 优点是单点登录:只需进行一次身份验证。您知道如何使用Facebook帐户登录Instagram,然后再也不需要登录了。您正在开发的应用程序类型将要求您使用特定的身份验证流程,然后会有不同的请求新的“访问令牌”或“ID令牌”的方式。最终,这取决于您的用例的实用性。 - Anton Toshik
.NET Identity 没有 JWT 选项吗? - variable

13

如果您的API需要连接多个应用程序或服务(Web、移动、其他服务),请使用令牌(JWT)。好处:无状态、可扩展性、无cookie,无CORS问题(如果允许)。

如果您的API只会被一个Web应用程序使用,请使用默认的ASP默认身份验证系统。这样更容易设置。


4
如果您的WebAPI和用户界面托管在同一个Web应用程序中,则基于令牌的安全性不会比内置身份验证提供的基于Cookie的身份验证更有优势。这是因为身份验证Cookie在每个HTTP请求中都会被发送回保持应用程序。当您调用与您登录的网站不同的网站时,这些Cookie不会被发送。因此,JSON Web Tokens(JWT)为浏览器提供了一种标准格式,以在无法使用Cookie的情况下向网站发送身份信息。

3
如果您的Web Api将要通过AJAX调用访问,则JWT可能是一个理想的选择,但不是必须的。根据您应用的描述,我认为默认的身份验证系统可以很好地为您服务。
Auth2是一种身份验证机制,可以启用外部登录,例如Facebook。它是默认身份验证系统的一部分,在您的应用程序中使用它不需要做太多工作。
OpenIddict位于Auth2之上。它是默认身份验证系统的一部分,在您的应用程序中使用它不需要做太多工作。它是一种身份验证机制,可以启用外部登录,例如Google+。
IdentityServer可用于大型通过Ajax调用访问的Web Api。例如,您可以使用IdentityServer来对前端Angular应用程序的用户进行身份验证。
再次强调,默认身份验证系统可以很好地为您服务。
希望这能帮到您...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接