问题说明:如何使用 UI 应用程序中的相同令牌调用多个 WebApi。
我的解决方案:
假设有两个Web-Api,WebApi01 和WebApi02。
在 Azure AD 中,我没有注册两个应用程序,而是只注册了一个应用程序,比如 MasterAPI。
此外,客户端应用程序,即 UI 应用程序必须像往常一样注册。
MasterAPI 不是一个实际的应用程序。因此,可能没有任何重定向 URL,我们也不需要任何重定向 URL。在此 API 中,我们首先为每个 WebAPI(WebAPI01 和 WebAPI02)声明两个范围。我通常遵循 App.Feature.Verb 等命名法。因此,范围名称将类似于 Master.WebAPI01.Read 和 Master.WebAPI02.Read。 p>
它们将像 api://MasterAPI-Application-Id//Master.WebAPI01.Read 和 api://MasterAPI-Application-Id//Master.WebAPI02 一样公开。在 azure 应用程序注册页面中阅读。
在访问令牌请求期间,我将这两个范围传递给 Azure AD 端点。我得到的响应包含范围声明 (scp),其值为“Master.WebAPI01.Read Master.WebAPI02.Read”。
"scp":"Master.WebAPI01.Read Master.WebAPI02.Read"
通过这种方式,我告诉系统受信任的 Client-UI 应用程序具有可访问两个功能的令牌。
简而言之,任何可以登录客户端应用程序的人都可以访问这两个功能。
现在,经过身份验证的用户有权使用两项功能。
这可以进一步限制。说,我,管理员,应该控制谁可以访问什么。
为此,我必须实现基于角色的访问控制 (RBAC)。我在 MasterAPI 中定义了自定义应用程序角色。
这可以通过操纵清单来完成。
现在,当我收到访问令牌时,我会获得带有值集的角色声明。该值取决于分配给用户的角色。
“角色”:[
"Access_WebAPI01",
“Access_WebAPI02”
],
token 通过 header 传递给资源 WebAPI(在本例中为 WebAPI01 或 WebAPI02)。接收者 WebAPI 然后解析 header token 以检查是否存在所需的角色。
因此,简而言之,Scope 和 RBAC 组合对我有用。而且我不必为身份验证和授权访问数据库。
如果添加了新功能,例如 WebAPI03。我需要做的就是在 MasterAPI 中设置范围。并且使用现有角色或为用户分配新角色。
PS:为什么选择 MasterAPI?在 Azure AD 中,所有范围只能来自一个资源。