Azure 广告提供商如何验证令牌和用户对应用程序的访问权限?

how do azure ad provider validate token and user access permission to the applications?

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

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

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

但是只有 WebApp1 有 ApiApp1 和 ApiApp2 的权限,WebApp2 只有 ApiApp2 的权限。

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

当我观察使用 fiddler 时,我没有看到任何调用授权 (AAD) 来验证令牌和应用程序权限?

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

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

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

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

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

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

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

In my case I have 4 applications in my directory WebApp1, WebApp2 ,ApiApp1, ApiApp2 & 2 users - user1 & user2

All the users are assigned to all applications.

But only WebApp1 has permission to ApiApp1 & ApiApp2 , WebApp2 has permission to ApiApp2 only.

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

  1. 在 Azure AD 门户中,创建 WebApp1、WebApp2、ApiApp1、ApiApp2。
  2. 在 WebApp1 的配置页面中,在“对其他应用程序的权限”部分,单击添加应用程序:
  3. select“所有应用”,找到ApiApp1、ApiApp2(这里我只以select一个应用为例):
  4. 添加对 selected api 应用程序的访问权限: 您需要在 WebApp1 中添加对 ApiApp1 & ApiApp2 的访问权限,在 WebApp2 中添加对 ApiApp2 的访问权限。要分配用户,您可以单击 WebApp1 和 WebApp2 中的用户和组选项卡,分配您想要的用户(user1&&user2)或组:

来自@juunas 的精彩回答的一些附加说明:

My question here is how do the AAD provider at applcation end validate the user token and permissions?

通常,客户端应用程序会针对其加密算法、令牌签名和令牌声明来验证令牌,例如:发行者——令牌是否来自预期的 IdP。观众——令牌是为我准备的吗? timestamps — 是在其有效期内的令牌 window 。您可以使用 JwtSecurityTokenHandler 来验证令牌。在 Azure AD V1.0 端点中,颁发者将是“https://sts.windows.net/Yourtenant/" and as @juunas said , it will query Azure Ad public keys during validating token signature .You could refer to code sample here 如何在 c# 中验证 JWT 令牌。

使用 OWIN 中间件将帮助您更轻松地执行此类验证,您可以参考 this code sample mvc 应用程序使用 OpenID Connect 登录 Azure AD 用户并使用 OAuth 2.0 访问令牌调用 Web api .在您的场景中,您希望一个应用程序调用另一个 API 应用程序,您可以添加以下代码以获取 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));