允许基于令牌的API访问Azure App Service上的某些端点

时间:2017-12-07 00:10:30

标签: azure authentication active-directory azure-web-sites

我在Azure的应用服务上运行了NodeJS应用。它由真人使用,并使用Active Directory身份验证:

enter image description here

目前,未经过身份验证的请求会重定向到Active Directly登录页面。它工作得很好。

但是,我现在要求另一个应用程序(而不是人类)能够访问某些API端点 - 可能是通过某种令牌身份验证。

我认为这样做的选择是:

  1. 使用内置的Azure内容。有一个示例here如何让客户端Azure应用程序对另一个进行身份验证,但我不认为这对我有用,因为我的客户端应用程序不是Azure应用程序。所以,我需要任何东西 - 例如curl请求 - 才能对我的应用进行身份验证。我在这儿吗? azure是否内置了“非Azure应用程序以使用Azure应用程序进行身份验证”?

  2. 我可以在上面的屏幕截图中选择“允许匿名请求(无操作)”选项,然后自己处理:实现api_tokens表,对于每个请求,检查API令牌是否为client_api/*端点,检查任何其他端点的Active Directory身份验证用户,如果未经过身份验证,请自行将其重定向到登录页面。

  3. 理想情况下,我可以说:如果请求是client_api/*然后允许未经身份验证的请求,并且我会检查请求是否包含有效令牌,但是对于所有其他请求,请按照您的要求执行操作现在 - 使用Active Directory身份验证并自动将未经身份验证的请求重定向到登录页面。

  4. 所以我的问题是: - 我是对的,auzure没有任何选择1)为我工作? - 有没有办法做选项3)? - 如果没有,我想这留下了选项2) - 或者有没有更好的方式我没想到?

1 个答案:

答案 0 :(得分:1)

我们已经完成了与您的1)选项类似的操作,好消息是您的客户端(调用API)不必在Azure中托管。

我们有一个自定义CRM插件需要调用Azure AD保护API APP的调用,这个过程相当冗长,但它可以工作(我们很久以前就设置了它,所以我认为以下步骤是正确的):

创建自己在Azure中托管的API,并确保它作为应用程序在Azure AD中注册(在Azure AD中 - >门户中的应用程序注册)

然后在Azure AD中创建一个新应用程序,将其称为“客户端AD应用程序”,并设置基本属性和密钥等。

实际上,从现在起,您的客户端API将充当“客户端AD应用程序”。

然后,您需要通过为受保护的API分配委派权限,从“客户端AD应用程序”授予对API的访问权限(同样,只需在Azure AD中的UI中执行此操作)。你这样做是通过将“elegate权限”分配给新的“客户端AD应用程序”应用程序(这对我来说不直观)

一旦您设置了2个应用程序并分配了权限,您就需要调用OAUTH API端点来获取令牌,然后在后续API调用中使用该令牌。

这里记录的大部分内容如下: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code

编辑: -

举个例子,我们对oauth端点的调用如下所示:

发送POST请求到: https://login.windows.net/[tennant]/oauth2/token 标题:

  • client_id :(新AD应用程序的应用程序ID)
  • client_secret :(新AD应用程序的秘密)
  • 资源:(您尝试访问哪个API端点 - 即受保护的API)
  • 用户名:有效的AD用户名
  • 密码:有效的AD密码
  • grant_type:密码(始终为'密码')

这会给你一个如下的回复:

{
    "token_type": "Bearer",
    "scope": "user_impersonation",
    "expires_in": "3600",
    "ext_expires_in": "0",
    "expires_on": "XXX",
    "not_before": "XXX",
    "resource": "...the resource you asked for...",
    "access_token": "...",
    "refresh_token": "..."
}

希望有助于交配。