带有SPA和API的OAuth2

时间:2018-04-16 10:36:42

标签: asp.net angular asp.net-core oauth-2.0 single-sign-on

我想在使用ASP.NET Core API的Angular 5 SPA中实现单点登录。我有公司提供的OAuth2服务器。 我想要实现的是只允许授权用户访问应用程序,这些用户必须通过SSO流程。我想仅向授权用户显示SPA的内容,并且只允许他们(具有正确access_tokens的用户)访问API资源。

我不知道这个要求的正确方法是什么。我在考虑:

  1. 隐式授权流程 - 来自我的SPA myspa.com:4200我正在调用mycompanyauthserver.com/Authorize来获取授权码。 使用Angular应用程序中的client_id和我调用mycompanyauthserver.com/Token来获取access token。我把它保存在localstorage中。现在,我可以将access token请求发送到我的API (myapi.com:5000),但如果此令牌是正确的,如何检查API?我在OAuth服务器上没有端点来执行此操作。另外,如果访问代码正确且用户没有操纵,如何检查SPA?

  2. 我看到的另一种方法是从SPA调用我的API中的某个端点,该端点将调用mycompanyauthserver.com/Authorize然后调用mycompanyauthserver.com/Token,然后API将具有access_token并将其返回到SPA。然后,如果access_code相同,我可以在从SPA向API发送请求时轻松检查。是正确的做法还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

您的SPA是否真的在localhost:4200?上运行这会使它成为本机应用程序,您可以在其中使用其他授权类型,例如使用PKCE的Auth代码。或localhost:4200只是SPA的本地/开发版本?

如果您的应用是SPA,并且将从外部Web资源提供html和javascript,那么隐式授权将针对此方案进行优化。

但即便如此,如果您的外部Web资源(提供SPA)也可以提供并注册可以与mycompanyauthserver.com/Token端点交互的重定向端点,那么您可以使用授权代码授予并返回access_token从服务器端重定向端点返回到浏览器 - 类似于您在选项2中的建议。

我不确定是否有正确的方法。

我见过SPA使用这两种方法。选项2涉及更多服务器端代码来管理令牌。选项1简化了获取令牌但不会为您提供长期/刷新令牌。请选择:)