如何验证每个用户可以使用OAuth和OpenID Connect访问哪些资源?

时间:2015-12-20 01:00:59

标签: api rest asp.net-web-api oauth authorization

假设我们有一些我们想要公开其资源的RESTful API。最终用户将通过客户端应用程序(如移动应用程序和在Web浏览器上运行的基于Javascript的客户端)使用此API。

使用OAuth 2.0,这个RESTful API将位于资源服务器上,我们将拥有一个注册客户端应用程序的授权服务器。然后,用户将在授权服务器上注册,并能够授予这些应用程序代表他们访问资源的权限。

因此,当用户访问一个客户端应用程序时,他将被重定向到授权服务器,并被提示授予所述客户端应用程序的权限。之后,将发出访问令牌,客户端可以向资源服务器发出请求。

所有这些对我来说都很清楚。只有一个缺失的部分:每个资源的保护可能取决于用户。更确切地说,它可能是依赖于声明的。我的意思是我们可以有以下情况:

当我第一次听说OAuth正在处理ASP.NET WebAPI时,我用以下方式解决了这个问题:当请求与Authorization: Bearer [token]标头一起发送时,在服务器端,线程主体已经设置了,我认为这意味着用户通过API进行了身份验证。所以我使用[Authorize]属性来验证用户是否可以访问资源。

在深入研究OAuth之后,我发现这是对协议的可怕滥用。正如我所了解的那样,OAuth授权应用程序而不是用户。当使用Authorization标头发出请求时,正如我所了解的那样,访问令牌不应包含有关用户的信息,而是包含允许发出请求的应用程序。

考虑到这一点,发送带有请求的Authorization标头并不能识别用户,也不会说用户是否可以访问所述资源。

在这种情况下,如何执行此类授权?我的意思是,不是授权执行请求的客户端应用程序,而是根据其声明访问资源的用户的授权?我相信这是OpenID Connect及其ID令牌的用武之地,但我不确定。如何管理这个?

1 个答案:

答案 0 :(得分:2)

你是对的,OAuth是NOT an authentication protocol,而是代表协议。

OpenID Connect为OAuth 2.0的令牌发布模型添加了两个值得注意的身份构造。

  • 身份令牌 - 从一方到另一方的交付 可以启用联合身份SSO用户体验

  • 标准化身份属性API - 客户可以在其中 检索给定用户的所需身份属性。

可以将ID TOken呈现给userinfo_endpoint以获取信息,并提供用户已通过OpenID提供商进行身份验证的保证级别。

BTW:" sub"即仅在授权服务器的上下文中唯一。建议如果你存储sub,你也存储像iss-sub这样的东西。谷歌的想法可能不是推特上的tsmith