与OAuth 2.0和JWT相关的一件事仍然有点令人困惑,那就是何时使用作用域与角色。
我认为一些困惑来自于基于角色的授权在ASP.NET Core(这是我工作场所的主要语言/框架(中的工作方式。例如如果我在JWT中的角色如下
{
"aud": "test",
"iss": "http://localhost:8080/auth/realms/test/",
"iat": 1585192274,
"nbf": 1585192274,
"exp": 1585196174,
"sub": "12345",
"roles": ["Admin", "SuperUser"]
}
我可以很容易地保护路线,而不需要做太多事情,例如:
[ApiController]
[Route("api/v{version:apiVersion}/template/test")]
public class TestController : Controller
{
[HttpGet]
[Authorize(Roles = "Admin")]
public IActionResult Get()
{
return Ok("test");
}
}
我可以使用具有dotnet授权策略的作用域来实现与上面非常类似的东西,但我只想知道是否有关于是否/何时使用作用域或角色的指导,或者这只是一个偏好问题。。。
在任何与OAuth/JWT相关的RFC中,我都找不到太多关于角色声明的引用,而作用域贯穿始终。
作用域和角色/组之间最显著的区别是谁决定客户端可以做什么。
资源范围由资源所有者(用户(通过同意屏幕授予应用程序。例如,客户端应用程序可以发布到我的时间线或查看我的朋友列表。
用户角色和组由Azure AD目录的管理员分配。例如,用户可以提交费用报告,也可以审批费用报告。
当外部应用程序希望通过公开的API访问用户的数据时,通常会使用作用域。它们决定客户端应用程序可以做什么
基于角色或组的访问通常在应用程序中使用,以确定用户可以做什么