OAuth范围以及应用程序角色和权限

Joh*_*ohn 5 security openid oauth-2.0 asp.net-identity identityserver4

目前,我的应用程序正在根据角色和权限验证用户的访问权限。例如,如果用户是admin,则他拥有所有权限。

但是,现在我正在为Web应用程序和REST API的单点登录和基于令牌的身份验证实现OAuth 2.0和OpenIdConnect。

OAuth 2.0和Open id connect严重依赖于范围进行访问控制。诸如account.write account.read account.delete之类的范围与权限“ CanCreateAccount”,“ CanReadAccount”,“ CanDeleteAccounts”,“ CanAssignRolesToPermissions”非常相似。

我不明白两者之间的区别。这种分离迫使我的应用程序在访问REST API时检查客户端的范围,并单独检查用户的权限。我相信这会导致代码重复。

我认为OAuth 2.0范围和应用程序权限相同是正确的吗?如果是这样,那么我是否应该坚持整个应用程序的作用域,而不是维护单独的应用程序权限?

例如,当前为用户分配了一个角色,并且该角色具有权限。如果我用范围替换权限,则不必重复客户端/用户范围/权限检查功能。

您可能在想为什么不使用权限替换作用域。那是因为我要坚持OAuth 2.0规范,并且在整个规范中都使用了范围。

m3n*_*ak3 10

Scopes是 per Client app,而permissionsper user。换句话说 - 一个客户端应用程序可以有一个范围来访问某些 API,但是这个客户端应用程序的用户将在这个 api 中拥有不同的权限(基于他们的角色)。您的应用程序不应检查范围。IdentityServer(我看到您已将其用作标记,因此我建议您将其用作 OAuth 身份验证器)将拒绝没有所需范围的客户端。您的应用程序必须只检查用户权限。

  • 我不相信这是一个角落案例。到目前为止,从我对 OAuth 的阅读来看,范围控制对 Api 资源的访问。请参阅 github 和 slack Api。他们似乎在使用范围来控制客户端对 API 资源的访问,它有点像权限一样使用。但是查看 Github.com 并不清楚他们如何处理单独的用户权限和 api 范围。https://developer.github.com/apps/building-oauth-apps/scopes-for-oauth-apps/ (2认同)
  • @m3n7alsnak3 因此,总而言之,资源服务器(API)必须检查**两者**:用户角色/权限**和**令牌范围,以便对每个 API 方法的授权做出决定。我的理解对吗? (2认同)

小智 9

我认为 OAuth 2.0 范围和应用程序权限相同吗?

从技术上讲,这是不正确的。

OAuth 2.0范围不是应用程序权限它们允许客户端应用程序代表用户访问资源。如果您的客户端应用程序已被授予资源的范围 X,则仅当用户具有相应的权限时才允许访问该资源。

换句话说,您的应用程序的范围必须与用户的权限一起检查。

要了解更多信息,请查看这篇有关权限、特权和范围之间差异的文章。