【发布时间】:2016-03-26 10:12:49
【问题描述】:
假设我们有一些 RESTful API,我们想要公开其资源。最终用户将通过客户端应用程序(如在 Web 浏览器上运行的移动应用程序和基于 Javascript 的客户端)使用此 API。
使用 OAuth 2.0,此 RESTful API 将位于资源服务器上,我们将拥有一个授权服务器,客户端应用程序在其上注册。然后,用户将在授权服务器上注册,并且能够代表他们授予这些应用程序访问资源的权限。
因此,当用户访问一个客户端应用程序时,他将被重定向到授权服务器并被提示授予该客户端应用程序的权限。之后颁发访问令牌,客户端可以向资源服务器发出请求。
这一切我都很清楚。只有一个缺失的部分:每个资源的保护可能取决于用户。更准确地说,它可能取决于索赔。我的意思是我们可以有以下情况:
资源 http://resourceserver.com/api/first-resource 应该只能由声明为“ExampleClaim”且值为 123 的用户访问。
资源 http://resourceserver.com/api/second-resource 应该只能由声明为“AnotherClaim”且值为 123 的用户访问。
资源http://resourceserver.com/api/third-resource 应该可供任何用户访问。
当我第一次听说 OAuth 正在处理 ASP.NET WebAPI 时,我是这样处理的:当使用 Authorization: Bearer [token] 标头发送请求时,在服务器端设置了线程主体,我认为这意味着用户已通过 API 进行身份验证。所以我使用[Authorize] 属性来验证用户是否可以访问资源。
在更深入地研究了 OAuth 之后,我发现这是对协议的严重滥用。据我所知,OAuth 授权应用程序而不是用户。据我所知,当使用 Authorization 标头发出请求时,访问令牌不应包含有关用户的信息,而应包含允许应用程序发出请求的信息。
考虑到这一点,在请求中发送 Authorization 标头不会识别用户,也不会说明用户是否可以访问所述资源。
在这种情况下,如何执行这种授权?我的意思是,不是授权执行请求的客户端应用程序,而是授权用户根据他的声明访问资源?我相信这就是 OpenID Connect 及其 ID 令牌的用武之地,但我不确定。如何管理这个?
【问题讨论】:
标签: api rest asp.net-web-api oauth authorization