利用 SameSite cookie 对与 API 托管在同一域中的 SPA 进行身份验证
Authentication for SPA hosted on same domain as API leveraging SameSite cookies
我正在考虑如何在我的 React 应用程序中实现身份验证,即使在阅读数小时后我仍然有一些问题。请提供您认为可以使我受益的任何信息我想真正理解问题可能是我在某处的推理暗示我不完全理解某些事情如果您能指出我错在哪里我将不胜感激。
基础设施:
- SSR React 应用程序在
<domain_name>
的反向代理后面提供服务
- .NET 5.0 api 服务器使用 asp.net 身份在
api.<domain_name>
上的反向代理后面提供服务
- 反向代理提供 SSL,因此
https://
在两者上
一般信息:
- 我需要支持外部登录(Google、Facebook 等)
- 不能为 Auth0、Okta 等付费
- 没有第 3 方应用会针对我进行身份验证
- 客户端是网络浏览器
- 我不需要支持过时的浏览器
问题:
- 我需要 IdentityServer4 吗?我永远不会充当第三方应用程序的身份验证机构。
- 我不使用 IS4 仍然可以支持外部登录,对吗?我只需要处理重定向回调我可以看到有
GetExternalLoginInfoAsync
、ExternalLoginSignInAsync
等方法可以使工作更容易。
- 之所以每个 SPA 认证教程都推荐 Auth Code + PKCE 是因为他们假设你想成为认证机构,在同一个域上没有 API,或者是在 SameSite cookie 存在之前写的?
我的计划是编写一个分配 SameSite cookie 的自定义登录路由,仅此而已。这使得 client-side 代码超级简单,无需在调用前向 headers 添加访问令牌。
可能吗?我发现很少有文章描述了非常相似的东西,但我不确定。
有了这样的设置,有什么是不可能的吗?比如远程注销,禁止用户,或者任何你能想到的。
如果您不想,则不必实施 IS4(特别是因为 IS4 将于 2022 年 11 月停止支持)。您可以只阅读 OAUTH2 文档并实施您需要的路由,并且仍然符合 OAUTH2。
您将只有一个客户端(您的 React 应用程序),因此没有动态客户端注册,只有以下 2 条路线:
授权端点,用于在用户使用外部提供商成功验证自己时获取授权代码。此授权码只能在下一条路线中使用一次。
使用上面给出的授权码或之前给出的刷新令牌获取访问令牌和刷新令牌的令牌端点。如果两次使用相同的授权代码或刷新令牌,您必须撤销在第一次调用中给出的令牌,因为这不应该发生。
With a setup like that is there something that is just not going to be possible? Like remote logout, banning users, or whatever you can think of.
除了这 2 条路线之外,您还可以自由实施任何您想要的路线。就像一条允许用户撤销他所有会话的路由。
为了更准确地回答您的问题:
Do I need IdentityServer4 at all? I am never going to act as an authentication authority for 3rd party apps.
不,如果您不确切知道为什么需要它,那么您就不需要它。这与您不打算充当其他客户端的身份验证机构没有任何关系。
I can still support external logins without using IS4 right? I just need to handle redirect callback I can see there are methods such as GetExternalLoginInfoAsync, ExternalLoginSignInAsync which should make the job easier.
可以,只要在用户使用外部提供商成功登录时存储授权码和刷新令牌即可。
The reason why every SPA authentication tutorial recommends Auth Code + PKCE is because they assume you want to be authentication authority, don't have API on the same domain, or were written before SameSite cookies existed?
我假设它们是面向 Oauth2 合规性的。但是,如果您不需要也不想实施 OAuth2 框架,那么就不要实施。但我认为你应该这样做,它真的很容易实现。
我正在考虑如何在我的 React 应用程序中实现身份验证,即使在阅读数小时后我仍然有一些问题。请提供您认为可以使我受益的任何信息我想真正理解问题可能是我在某处的推理暗示我不完全理解某些事情如果您能指出我错在哪里我将不胜感激。
基础设施:
- SSR React 应用程序在
<domain_name>
的反向代理后面提供服务
- .NET 5.0 api 服务器使用 asp.net 身份在
api.<domain_name>
上的反向代理后面提供服务
- 反向代理提供 SSL,因此
https://
在两者上
一般信息:
- 我需要支持外部登录(Google、Facebook 等)
- 不能为 Auth0、Okta 等付费
- 没有第 3 方应用会针对我进行身份验证
- 客户端是网络浏览器
- 我不需要支持过时的浏览器
问题:
- 我需要 IdentityServer4 吗?我永远不会充当第三方应用程序的身份验证机构。
- 我不使用 IS4 仍然可以支持外部登录,对吗?我只需要处理重定向回调我可以看到有
GetExternalLoginInfoAsync
、ExternalLoginSignInAsync
等方法可以使工作更容易。 - 之所以每个 SPA 认证教程都推荐 Auth Code + PKCE 是因为他们假设你想成为认证机构,在同一个域上没有 API,或者是在 SameSite cookie 存在之前写的?
我的计划是编写一个分配 SameSite cookie 的自定义登录路由,仅此而已。这使得 client-side 代码超级简单,无需在调用前向 headers 添加访问令牌。
可能吗?我发现很少有文章描述了非常相似的东西,但我不确定。
有了这样的设置,有什么是不可能的吗?比如远程注销,禁止用户,或者任何你能想到的。
如果您不想,则不必实施 IS4(特别是因为 IS4 将于 2022 年 11 月停止支持)。您可以只阅读 OAUTH2 文档并实施您需要的路由,并且仍然符合 OAUTH2。
您将只有一个客户端(您的 React 应用程序),因此没有动态客户端注册,只有以下 2 条路线:
授权端点,用于在用户使用外部提供商成功验证自己时获取授权代码。此授权码只能在下一条路线中使用一次。
使用上面给出的授权码或之前给出的刷新令牌获取访问令牌和刷新令牌的令牌端点。如果两次使用相同的授权代码或刷新令牌,您必须撤销在第一次调用中给出的令牌,因为这不应该发生。
With a setup like that is there something that is just not going to be possible? Like remote logout, banning users, or whatever you can think of.
除了这 2 条路线之外,您还可以自由实施任何您想要的路线。就像一条允许用户撤销他所有会话的路由。
为了更准确地回答您的问题:
Do I need IdentityServer4 at all? I am never going to act as an authentication authority for 3rd party apps.
不,如果您不确切知道为什么需要它,那么您就不需要它。这与您不打算充当其他客户端的身份验证机构没有任何关系。
I can still support external logins without using IS4 right? I just need to handle redirect callback I can see there are methods such as GetExternalLoginInfoAsync, ExternalLoginSignInAsync which should make the job easier.
可以,只要在用户使用外部提供商成功登录时存储授权码和刷新令牌即可。
The reason why every SPA authentication tutorial recommends Auth Code + PKCE is because they assume you want to be authentication authority, don't have API on the same domain, or were written before SameSite cookies existed?
我假设它们是面向 Oauth2 合规性的。但是,如果您不需要也不想实施 OAuth2 框架,那么就不要实施。但我认为你应该这样做,它真的很容易实现。