如何调试B2C权限不足的Azure应用程序?

时间:2017-07-11 00:11:25

标签: azure asp.net-web-api2 hello.js azure-ad-b2c

环境

我有一个Azure B2C租户,用于管理简单的用户名/密码注册和登录,请按照此处的示例进行操作:https://github.com/Azure-Samples/active-directory-b2c-javascript-hellojs-singlepageapp

租户管理前端的javascript / html应用程序的身份验证,然后该前端应用程序与后端的WebAPI应用程序通信以获取其数据。

后端WebAPI取自此处的示例:https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi

这两个应用程序都已在租户中注册,并且需要进行身份验证才能工作。

什么有用

直接从Azure门户进行测试时,身份验证效果很好。

成功授权请求:

Request URL:https://login.microsoftonline.com/dhzb2c.onmicrosoft.com/oauth2/v2.0/authorize?p=B2C_1_SiUpIn&client_id=2bb37577-246c-48a7-b047-2ce2a748dfda&nonce=defaultNonce&redirect_uri=http%3A%2F%2Flocalhost%3A65328%2Fredirect.html&scope=openid&response_type=id_token&prompt=login
Request Method:GET

什么不起作用

当尝试通过在租户中注册的后端通过前端登录时,我明白了:

Correlation ID: 4ac6f519-0949-42e0-96a7-d84d14454bbb
Timestamp: 2017-07-10 23:07:48Z
AADB2C90205: This application does not have sufficient permissions against this web resource to perform the operation.

从未到达API后端。

不成功的授权请求:

Request URL:https://login.microsoftonline.com/tfp/dhzb2c.onmicrosoft.com/B2C_1_SiUpIn/oauth2/v2.0/authorize?client_id=2bb37577-246c-48a7-b047-2ce2a748dfda&response_type=token%20id_token&redirect_uri=http%3A%2F%2Flocalhost%3A65328%2Fredirect.html&state=%7B%22client_id%22%3A%222bb37577-246c-48a7-b047-2ce2a748dfda%22%2C%22network%22%3A%22adB2CSignInSignUp%22%2C%22display%22%3A%22page%22%2C%22callback%22%3A%22_hellojs_cprxketk%22%2C%22state%22%3A%22%22%2C%22redirect_uri%22%3A%22http%3A%2F%2Flocalhost%3A65328%2Fredirect.html%22%2C%22scope%22%3A%22openid%2Chttps%3A%2F%2Fdhzb2c.onmicrosoft.com%2Ftestb2capi%22%2C%22page_uri%22%3A%22http%3A%2F%2Flocalhost%3A65328%2Findex.html%22%7D&scope=openid%20https://dhzb2c.onmicrosoft.com/testb2capi
Request Method:GET

我尝试过什么

我已经尝试过查找日志,比如权限错误日志,这会记录有关问题的详细信息,但却找不到。

问题

也许还有另一个地方需要查找日志?

我还能做什么?

身份验证错误消息旨在限制他们提供的信息,因此 可以通过某种方式获得有关错误的更多特异性。什么我不知道?

4 个答案:

答案 0 :(得分:5)

首先,回答我原来的问题,所以我不会将此标记为答案。我会让别人给出真正的答案,也许相关ID很重要?然而,这个答案确实解决了我的问题。

在Azure B2C中,权限称为“范围”。

这意味着为了在没有给定权限错误的情况下成功进行身份验证,需要以下内容:

(1)后端应用程序必须发布范围

enter image description here

(2)前端应用程序必须订阅该范围

enter image description here

(3)授权请求必须将范围包含在scope字段中。

Request URL:https://login.microsoftonline.com/tfp/dhzb2c.onmicrosoft.com/B2C_1_SiUpIn/oauth2/v2.0/authorize?client_id=2bb37577-246c-48a7-b047-2ce2a748dfda&response_type=token%20id_token&redirect_uri=http%3A%2F%2Flocalhost%3A65328%2Fredirect.html&state=%7B%22client_id%22%3A%222bb37577-246c-48a7-b047-2ce2a748dfda%22%2C%22network%22%3A%22adB2CSignInSignUp%22%2C%22display%22%3A%22page%22%2C%22callback%22%3A%22_hellojs_bb3gzjb8%22%2C%22state%22%3A%22%22%2C%22redirect_uri%22%3A%22http%3A%2F%2Flocalhost%3A65328%2Fredirect.html%22%2C%22scope%22%3A%22openid%2Chttps%3A%2F%2Fdhzb2c.onmicrosoft.com%2Ftestb2capi%2Fread%22%2C%22page_uri%22%3A%22http%3A%2F%2Flocalhost%3A65328%2F%22%7D&scope=openid%20https://dhzb2c.onmicrosoft.com/testb2capi/read
Request Method:GET

注意

认为您发布的范围名称无关紧要,唯一重要的是至少使用一个范围。

答案 1 :(得分:0)

我们的API身份验证存在类似问题。我们添加了一个B2C应用程序,发布了范围(user_impersonation)并在其自身上添加了API访问。稍后,我们决定向Azure AD添加自定义域,并将其作为主域。之后我们添加的所有应用程序在授权时都收到了相同的错误(AADB2C90205)。我们能够"调试"通过使用浏览器的开发者工具(ChromeFirefox)并观看"网络"选项卡列表,同时加载应用程序列表。我们注意到的一个区别是" identifierUris"的数组。正在运行的那个具有默认的https://somestring.onmicrosoft.com/ApiName/网址,而所有其他不起作用的应用程序都使用我们的自定义Uri。我们的解决方案是,再次将默认的 .onmicrosoft.com / uri作为主要内容,然后添加我们的自定义域。

因此,在回答您的问题时:您可以使用浏览器的网络流量记录器来分析身份验证过程中出现的问题。我希望这个答案中的信息可以帮助其他人在追踪他们自己的解决方案时遇到同样的错误。

答案 2 :(得分:0)

如果你去这个github并下载

 https://github.com/Azure-Samples/active-directory-b2c-advanced-policies
在其中你会找到一个名为JourneyRecorder的SAMPLE MVC应用程序

如果您将此部署到Azure,则可以将策略设置为开发模式并记录可用于调试的信息,有些人更喜欢应用程序见解,但我认为这仍然是最具信息性的

 DeploymentMode="Development" 
 UserJourneyRecorderEndpoint="https://your-app-name/stream?id=<Any GUID You can think of>" >

然后上传并执行您的政策,然后导航至

  https://your-app-name/trace_102.html?id=<your GUID>

它不是一个很好的用户界面,但如果你正确设置它会记录你的终端,你可以用它来调试B2C旅程

答案 3 :(得分:0)

@David的帖子是正确的,但是应用程序现在标记为(旧版),建议使用App registrations

enter image description here

但是非常相似。在您的App registration中,点击Expose an API并添加一个新的范围。之后,单击API permissionsAdd a permission。选择APIs my organization uses,您的App registration名称,然后选择新创建的范围。如果需要管理员同意,则需要单击Grant admin conscent for <YOUR ADB2C>。之后,一切对我都有效。

enter image description here