首页 > 解决方案 > 没有 cookie 的 IdentityServer4 外部身份验证

问题描述

我无法理解 ASP.NET Core 身份验证的工作原理。

我想使用刷新令牌实现 JWT 访问令牌身份验证。据我所知,这是验证客户端(移动应用程序、SPA Web 应用程序)的行业标准。出于安全目的,我宁愿不实现自己的授权逻辑,包括 JWT 生成和刷新令牌处理。由于 ASP.Net 本身并不支持这一点,我自然会选择使用IdentityServer4,一个用于处理这类东西的大型开源库。

但是IdentityServer4很大程度上基于 OAuth,我不确定它如何与 SPA 应用程序和移动应用程序(我信任的客户端)一起使用。它要求客户端重定向到某个任意网页以输入其凭据,然后重定向回应用程序。总的。我从未见过像 Snapchat、Instagram 等主要应用程序具有这种身份验证流程,您在登录流程中会被定向到某些网页/浏览器。幸运的是IdentityServer4,有一个小功能可以为我信任的客户处理用户名/密码身份验证(http://docs.identityserver.io/en/latest/quickstarts/2_resource_owner_passwords.html

太好了,这似乎符合我的需要。但是...现在我想添加 Facebook 身份验证。IdentityServer4允许External Authentication,但它仍然是基于 cookie 的(据我所知)。这需要 Android/iOS/SPA 应用程序重定向到网页,然后重定向回应用程序。同样,从用户的角度来看,这并不理想。Facebook 提供本地移动 SDK 来处理这种类型的身份验证,该身份验证返回访问令牌,因此无需使用 cookie 重定向到网页。

现在假设我的 iOS 应用程序使用 Facebook SDK 为用户获取访问令牌并将其发送到后端。后端根据 Facebook SDK 验证令牌,然后在其自己的数据库中注册本地用户。

现在,当同一个 iOS 用户尝试登录应用程序时,应用程序将从 SDK 为该用户生成一个 facebook 访问令牌并将其发送到后端。但是我不确定如何利用IdentityServer4为用户生成 JWT,因为我需要该用户的用户名和密码。这就是我卡住的地方。我似乎在与图书馆作斗争,这让我相信我严重误解了一些东西。

TLDR;IdentityServer4似乎很大程度上基于 cookie,当您从身份验证网页来回重定向时,这些 cookie 并不能很好地适应移动应用程序/SPA 网页。我是否使用了错误的工具来完成这项工作?有哪些替代解决方案?

标签: authenticationasp.net-coreidentityserver4

解决方案


作为对大型社交应用程序的说明:我认为这取决于谁保存了密码。Facebook、Instagram、Snapchat、Google 充当第三方的身份提供者。他们自己要求用户注册并指定他们保留的密码。因此,他们可以使用任何自定义方法来处理这些密码的验证。但是,如果他们中的任何一个提供使用其他 Ie 登录的可能性,Instagram 允许使用 Amazon 凭据登录,那么他们将需要遵循 OAuth 之类的标准方式并重定向到第三方进行登录. 上次我检查 Instagram、Facebook 和 Snapchat 时只提供注册,而没有选择与第三方登录的选项,这解释了为什么不需要重定向。

现在,如果我们确定重定向是必要的邪恶,那么跨数据传输的方法就没有那么多了。即,我们要么需要通过查询字符串传递数据,要么使用 cookie。我还想念其他人吗?

两者都有局限性,但由于 cookie 是持久存在的,并且浏览器会在每个请求中自动携带它们,因此它们似乎确实是该工作的更好选择,尤其是在外部 IdP 需要多个重定向来跟踪身份验证请求的状态时。这里提到了同样的原因:

http://docs.identityserver.io/en/latest/topics/signin_external_providers.html


推荐阅读