为什么在需要身份验证时无法访问我的Azure功能?

时间:2019-05-22 16:04:10

标签: azure-active-directory postman azure-functions

(对于这个问题的冗长,我深表歉意;我想更加详尽。)

我是Azure的新手,正在尝试设置一个需要身份验证的“无服务器” API。我有一个在未启用身份验证时正常运行的功能(在Node.js中基本上只是“ Hello,world”)。但是,启用身份验证后,唯一的响应是:

You do not have permission to view this directory or page.

要启用身份验证,我:

  1. 转到Azure门户中的Azure Active Directory。
  2. 去了应用程序注册。
  3. 为“功能”应用创建了新的注册。
  4. 添加了https://<myapp>.azurewebsites.net/.auth/login/microsoftaccount/callback的Web重定向URI。
  5. 为我的应用创建了一个新的客户端机密。
  6. 从仪表板转到我的应用程序,选择“平台功能”标签,然后单击“身份验证/授权”。
  7. 启用了“应用服务验证”。
  8. 为Microsoft身份验证提供程序配置上述注册的应用程序ID和客户端密钥。
  9. 将“未验证请求时采取的措施”设置为“使用Microsoft帐户登录”。

这时,如果没有身份验证,我将无法再访问API端点(如预期的那样)。然后,我配置邮递员通过以下方式获取令牌:

  1. 选择“授权”标签。
  2. 将“类型”设置为“ OAuth 2.0”。
  3. 点击“获取新访问令牌”。
  4. 设置以下值:
    • 授予类型:授权码
    • 回调URL:https://<myapp>.azurewebsites.net/.auth/login/microsoftaccount/callback(与我在上面的“应用注册”中输入的网址相同)。
    • 验证网址:https://login.microsoftonline.com/<Directory (tentant) ID>/oauth2/authorize?resource=<Application (client) ID>
    • 访问令牌URL:https://login.microsoftonline.com/<Directory (tentant) ID>/oauth2/token?resource=<Application (client) ID>
    • 客户端ID:<应用程序(客户端)ID>
    • 客户机密:<客户机密>
    • 范围:
    • 状态:
    • 客户端身份验证:作为基本身份验证标头发送
  5. 单击“请求令牌”按钮。
  6. 以我自己的身份在弹出的窗口中登录。 (仅第一次发生;大概是我的凭据被缓存在某个地方。)
  7. 单击“使用令牌”按钮。
  8. 单击“预览请求”按钮。

当我单击“发送”时,出现上述错误。如果我禁用身份验证或将“采取措施...”更改为允许未经授权的请求,它将再次开始工作(但当然不需要身份验证)。据我所知,我已经运行了邮递员通过JWT.io收到的JWT,有效载荷看起来合理:

{
  "aud": "<Application (client) ID>",
  "iss": "https://login.microsoftonline.com/<Directory (tentant) ID>/v2.0",
  "iat": 1558488698,
  "nbf": 1558488698,
  "exp": 1558492598,
  "aio": "<base64? data>",
  "azp": "<Application (client) ID>",
  "azpacr": "1",
  "idp": "live.com",
  "name": "Ben Blank",
  "oid": "<a GUID I don't recognize>",
  "preferred_username": "ben.blank@gmail.com",
  "scp": "User.Read",
  "sub": "<base64? data>",
  "tid": "<Directory (tentant) ID>",
  "uti": "<base64? data>",
  "ver": "2.0"
}

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:1)

您需要将Postman注册为AAD中的客户端应用,并授予其调用API的权限,类似于here,除了您将授予其访问API的权限(而不是链接中的AAD图形)。您的邮递员将需要配置为使用该应用的客户端ID和密码来获取令牌。现在,您正在使用Postman要求您的API应用程序获取自身的访问令牌。您的应用很可能没有在AAD中配置为可自行调用! (无论如何都没有道理。)

答案 1 :(得分:0)

您正在使用Microsoft帐户作为身份验证提供程序。获取访问令牌的方式与Azure Active Directory有关,而不与Microsoft Account有关。

访问函数网址https://tonytest4.azurewebsites.net/api/HttpTrigger1?name=test时,您将重定向到登录页面。您会发现URL为https://login.live.com/oauth20_authorize.srf?。输入正确的凭据后,您将可以访问您的功能。

enter image description here