2

当使用 AZURE AD 进行身份验证时,我们会获得一个成功登录的令牌,我们将其传递给资源服务器或 api 控制器。

在我的情况下,我的目录中有 4 个应用程序 WebApp1、WebApp2、ApiApp1、ApiApp2 和 2 个用户 - user1 和 user2

所有用户都分配给所有应用程序。

但是只有 WebApp1 对 ApiApp1 & ApiApp2 有权限,WebApp2 只有对 ApiApp2 有权限。

我的问题是应用程序端的 AAD 提供程序如何验证用户令牌和权限?

当我观察到使用提琴手时,我没有看到对授权 (AAD) 进行任何调用以验证令牌和应用程序权限?

应用端的 AAD 提供者如何确保它是由一个有效的 AAD 颁发并且用户对应用程序有权限?

如果它是 API 应用程序,AAD 提供程序如何确保向其颁发令牌的应用程序有权访问 Web 应用程序?

4

2 回答 2

1

所以这里有很多问题,所以我会尽力回答所有问题。

应用程序仅通过验证其数字签名来检查令牌是否使用正确的密钥进行签名。通常,当应用程序启动时,会调用一次授权来获取签名公钥。如果你看不到它,要么是因为 Fiddler 看不到它,要么是因为有问题的库没有验证令牌(!)。对于使用 OWIN OpenId Connect 中间件的应用程序,我可以看到对 的调用https://login.microsoftonline.com/tenant-id/.well-known/openid-configuration,然后https://login.microsoftonline.com/common/discovery/keys是签名公钥所在的位置。

用户对应用程序的许可在他们的声明中。当您向应用程序添加委托/应用程序权限时,您始终定义一个value. 这些值在令牌中发送。应用程序权限位于称为roles(IIRC) 的声明中,委托位于scp. Azure AD 只会将声明放在那里,以获得授予每个应用程序/用户的权限。您的应用信任 AAD 做正确的事情(并使用签名验证它确实是 AAD)。

这实际上适用于 Web 和 API 应用程序。例如,如果您尝试通过授权码授予流程登录前端应用程序,用户将收到一条错误消息,提示他们不允许访问该应用程序。AAD 不会为此用户发回授权代码/ID 令牌。如果你有一个,他们很好。

您的 WebApp1 无法调用 ApiApp2,因为 AAD 不会为其提供访问令牌。

于 2017-03-08T13:35:16.107 回答
0

在我的情况下,我的目录中有 4 个应用程序 WebApp1、WebApp2、ApiApp1、ApiApp2 和 2 个用户 - user1 和 user2

所有用户都分配给所有应用程序。

但是只有 WebApp1 对 ApiApp1 & ApiApp2 有权限,WebApp2 只有对 ApiApp2 有权限。

如果这是您的情况,您可以按照以下步骤操作:

  1. 在 Azure AD 门户中,创建 WebApp1、WebApp2、ApiApp1、ApiApp2。
  2. 在 WebApp1 的配置页面中,在“对其他应用程序的权限”部分,单击添加应用程序: 在此处输入图像描述
  3. 选择“All Apps”,找到ApiApp1、ApiApp2(这里我只选择一个应用为例): 在此处输入图像描述
  4. 为选中的 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));
于 2017-03-09T10:12:12.910 回答