【问题标题】:ASP .NET Core Identity default authentication vs JWT authenticationASP .NET Core Identity 默认身份验证与 JWT 身份验证
【发布时间】:2017-09-11 22:20:49
【问题描述】:

我正在开发 ASP NET Core Web API,但我对选择身份验证方法感到困惑。我曾经应用默认的 Asp Net Identity 身份验证,但最近我知道了 JWT。所以我几乎按照本文中的做法实现了身份验证:https://stormpath.com/blog/token-authentication-asp-net-core。 但我无法理解这个 JWT 的好处。使用简单的 Asp Net Identity Authentication,我不关心令牌存储等。我只需要使用 signInManager 登录并使用授权方法直到注销。使用 JWT,我需要考虑令牌存储、过期和其他困难。那么,这个 JWT 有什么好处呢?登录后如何存储此 JWT 令牌?此外,我什至应该使用这个 JWT 吗?在我的情况下,我需要对简单的 WebApi 进行简单的身份验证,它将被一个或更多的用户使用。我也听说过 OpenIddict、Auth0、IdentityServer,那么所有这些身份验证机制有什么区别?

【问题讨论】:

    标签: authentication asp.net-core asp.net-identity jwt asp.net-core-webapi


    【解决方案1】:

    这是我理解的方式,分为 3 个逻辑部分。

    1. 身份验证服务器 - 这将进行身份验证并颁发 JWT 令牌,当 API 需要验证令牌时,它会将令牌发送到此服务器以进行验证。
    2. 客户端 - 这是为您的网页提供服务的,或者您的应用程序。这是请求和存储 JWT 令牌所需的内容。客户端每次请求数据时都需要将令牌传递给 api。
    3. API - 这是提供信息并需要使用身份验证服务器验证令牌的内容。

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

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

    我如何在登录后存储这个 JWT 令牌?

    我只尝试将它存储在使用 angular 2 的 Ionic 2 应用程序中,该应用程序具有存储模块。但我很确定很多人已经这样做了并提出了这个问题:

    Simple JWT authentication in ASP.NET Core 1.0 Web API

    Token Based Authentication in ASP.NET Core (refreshed)

    更新 如果你的前端是纯粹的 html/js/css 并且没有后端来容纳它,你可以将你的令牌存储在本地存储中,有多个 npm 包可以帮助你解决这个问题like this one。你想寻找隐式流。

    否则,如果您的前端确实有一个后端,您希望将令牌存储在您选择的会话/数据库中,则有第三方提供商可以执行此操作,例如 IdentityServer4。你想使用混合流

    此外,我什至应该使用这个 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 使用身份验证,它会向另一个 Web Api 发出经过身份验证的请求,那么最好的解决方案就是单点登录? (IdentityServer4, Auth0)?
    • @AndrewK 客户端将令牌传递给 api,该 api 使用身份验证服务器验证令牌,如果您有多个 api,您只需将它们指向同一个身份验证服务器,这样多个 api's/客户端可以使用单点登录,因为颁发的令牌来自单个身份验证服务器。请记住,身份验证服务器不是 API。我使用了 Identity Server 4,它允许您创建一个可以发布和验证令牌的身份验证服务器。注意:如果你有 1 个 api 调用另一个你做错了。
    • @Anton 我认为 asp.net 身份不使用会话,它只是用户声称加密并放入 cookie,所以我们没有获得任何性能,但是通过使用令牌 API服务器必须调用身份验证服务器来验证令牌,因此我认为 cookie 的性能更好。
    • @AntonToshik 但是你如何保存这个令牌?喜欢用户在 2 天后回到您的网站,如果不使用 cookie,她将不得不再次登录。那么到底有什么好处呢?
    • @lll 优点是单点登录:1 点身份验证。您知道如何使用您的 Facebook 帐户登录 Instagram,然后再也不用登录了。您正在开发的应用程序类型将要求您使用特定的身份验证流程,然后会有不同的方式请求新的access tokensid tokens。最终,这是否有用取决于您的用例。
    【解决方案2】:

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

    如果您的 API 将仅由一个 Web 应用程序使用,请使用默认的 ASP 默认身份验证系统。它更容易设置。

    【讨论】:

      【解决方案3】:

      如果您的 webapi 和用户界面托管在同一个 Web 应用程序中,则基于令牌的安全性不会比内置身份验证提供的基于 cookie 的身份验证为您带来任何好处。这是因为身份验证 cookie 会在每个 HTTP 请求上发送回 keep 应用程序。当您拨打您在这些 cookie 上登录的网站以外的网站时,这些 cookie 不会被发送。因此 JSON Web Tokens (JWT) 为浏览器提供了一种标准格式,以便在无法选择 cookie 时向网站发送身份信息。

      【讨论】:

        【解决方案4】:

        如果要通过 AJAX 调用访问您的 Web Api,那么 JWT 可能是一个理想的选择,但不是强制性的。从您的应用程序的描述来看,在我看来,默认的身份验证系统可以很好地为您服务。 Auth2 是启用外部登录(例如 Facebook)的身份验证机制。它是默认身份验证系统的一部分,您无需做太多工作即可在您的应用程序中使用它。

        OpenIddict 位于 Auth2 之上。它是默认身份验证系统的一部分,您无需做太多工作即可在您的应用程序中使用它。它是启用外部登录(例如Google+)的身份验证机制

        IdentityServer 可用于由 Ajax 调用访问的大型 Wep Api。例如,您可以使用 IdentityServer 对渴望使用前端 Angular 应用程序的用户进行身份验证。

        再一次,默认的身份验证系统可以很好地为您服务。

        希望对你有帮助……

        【讨论】:

          猜你喜欢
          • 2017-06-26
          • 2023-04-01
          • 2020-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-15
          • 1970-01-01
          相关资源
          最近更新 更多