在我的情况下,我的目录中有 4 个应用程序 WebApp1、WebApp2、ApiApp1、ApiApp2 和 2 个用户 - user1 和 user2
所有用户都分配给所有应用程序。
但是只有 WebApp1 对 ApiApp1 & ApiApp2 有权限,WebApp2 只有对 ApiApp2 有权限。
如果这是您的情况,您可以按照以下步骤操作:
- 在 Azure AD 门户中,创建 WebApp1、WebApp2、ApiApp1、ApiApp2。
- 在 WebApp1 的配置页面中,在“对其他应用程序的权限”部分,单击添加应用程序:
- 选择“All Apps”,找到ApiApp1、ApiApp2(这里我只选择一个应用为例):
- 为选中的 api 应用
添加访问权限:您需要在 WebApp1 中添加对 ApiApp1 和 ApiApp2 的访问权限,在 WebApp2 中添加对 ApiApp2 的访问权限。要分配用户,您可以单击 WebApp1 和 WebApp2 中的用户和组选项卡,分配您想要的用户(user1&&user2)或组:
来自@juunas 的一些额外说明以获得很好的答案:
我的问题是应用程序端的 AAD 提供程序如何验证用户令牌和权限?
通常,客户端应用程序会为其加密算法、令牌签名和令牌声明验证令牌,例如:颁发者 - 令牌是否来自预期的 IdP。观众——令牌是为我准备的吗?时间戳 — 是其有效性窗口内的令牌。您可以使用 JwtSecurityTokenHandler 来验证令牌。在 Azure AD V1.0 端点中,颁发者将是“ https://sts.windows.net/Yourtenant/ ”,正如@juunas 所说,它将在验证期间查询 Azure Ad 公钥令牌签名。您可以参考此处的代码示例,了解如何在 c# 中验证 JWT 令牌。
使用 OWIN 中间件将帮助您更轻松地执行此类验证,您可以参考此代码示例,用于使用 OpenID Connect 登录 Azure AD 用户并使用 OAuth 2.0 访问令牌调用 Web api。在您的场景中,您希望一个应用程序调用另一个 API APP ,您可以添加以下代码来获取 API 的访问令牌:
string resource = "http://testbasic1.onmicrosoft.com/testrole"; //Your API APP
string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
AuthenticationContext authContext = new AuthenticationContext(Startup.Authority, new NaiveSessionCache(userObjectID));
ClientCredential credential = new ClientCredential(clientId, appKey);
var result = await authContext.AcquireTokenSilentAsync(resource, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));