如何使用Azure Active Directory设置外部应用程序的客户端凭据流

时间:2019-04-10 12:02:15

标签: azure active-directory azure-active-directory azure-ad-b2c

我们遇到以下情况:

外部网络

  • 1个我们无法控制的应用程序

内部网络:

  • 1个内部api(azure函数)
  • Active Directory B2C

我想根据官方的Microsoft文档(first bullet point)保护内部api。但是要实现此目的,我们需要使用活动目录对客户端进行身份验证。

由于调用我们api的客户端是另一个应用程序(不是用户),因此我们需要根据OAuth2使用客户端凭据流。然后,身份提供者必​​须向我提供一个包含自定义范围的令牌(另一方可以检查)

不幸的是,在阅读了大量有关如何使用Azure AD的文档之后,我无法检索包含自定义范围的JWT令牌。

我已经尝试在活动目录刀片中注册应用程序: Application Registration

在其设置页面上,我尝试注册权限(这似乎是AD领域的范围),但仅显示了官方的Microsoft API。 Setting Permissions for a Application

如何添加外部api的权限?

使用应用程序密钥创建的令牌也不包含“ scp”或“范围”声明。如何将范围声明纳入令牌?

更新1

我在AD B2C Blade中为我的api( our-api )注册了一个应用程序: Azure AD B2C Application for the Api

对于我在AD Blade中注册了应用程序的客户端( TestClient 1 TestClient 2 ): Azure AD Applications for the Client

TestClient 1 需要我的“ our-api”应用程序的权限: Required Permissions

TestClient 2 不需要任何许可: Require no permissions

当我尝试使用 TestClient 1 登录到AD时,得到了预期的access_token。但是,如果尝试以 TestClient 2 身份登录,我也会获得一个access_token。这个过程不应该失败吗?如何验证只有 TestClient 1 具有该权限?

1 个答案:

答案 0 :(得分:1)

  

如何验证只有TestClient 1拥有此权限?

您可以在jwt.io中解析令牌,可以检查令牌的权限。

v1令牌样本 enter image description here

  

当我尝试使用TestClient 1登录到AD时,得到了预期的access_token。但是,如果我尝试以TestClient 2身份登录,我也会获得一个access_token。

首先,即使您尚未将其添加到应用程序的Requried权限中,也可以使用任何应用程序获取可以在应用程序的Requried权限中找到的任何API的access_token,但是您无法使用此access_token来访问API的资源,因为令牌没有权限。如前所述,您创建了自己的API,因此该API没有应用程序权限。而且在客户端凭据流中,它不是代表用户的,因此只有应用程序权限才在此流中起作用,并且两个测试应用程序的令牌都将没有权限。