登录

时间:2018-04-04 13:32:29

标签: angular azure-ad-b2c msal

我花了相当多的时间来尝试理解和正确使用MSAL,但我仍然在苦苦挣扎。我有很多问题,我不确定该怎么做/我做错了什么。

这就是我所拥有的:

1)从github下载的Active-Directory-B2C-Javascript-Angular2.4-spa应用程序。

2)我重新配置它以使用我创建的B2C租户

3)我可以通过Facebook登录或创建我自己的帐户(有时)

从现在开始,我正在努力解决两个问题:acquireTokenSilent - 总是失败,并最终调用acquireTokenPopup(它似乎弹出一个窗口)。所以我不确定为什么acquireTokenSilent会失败,但是当它调用acquireTokenPopup时,弹出窗口会被阻止。

1)我认为acquireTokenSilent失败可能是由于我要求的“范围”。我查看了Azure文档并且不了解如何创建一个范围,所以我有点卡在那里。我可以使用默认值吗?我尝试了一个空字符串,但它失败了。我也尝试了https://myapp.onmicrosoft.com/demoapi/demo.read没有意义,但无论如何我都试过了(没有意义,因为我无法在任何地方看到它)。

2)我想也许删除我的弹出窗口拦截器,它在每个浏览器中都是默认的,现在可能导致acquireTokenPopup工作。 INSTEAD:它仍然失败,但是当我调用loginPopup时它会打开两次登录窗口。是两次。我调试了代码以确保我没有两次调用loginPopup。我不是......

有人可以解释为什么在弹出窗口拦截器的时代,图书馆甚至会尝试这个代码吗?有人启用弹出窗口只是为了使用你的应用程序似乎非常古老......有没有办法解决这个库?

有人有什么建议吗?

1 个答案:

答案 0 :(得分:0)

根据github repo上的自述文件,您可以按原样克隆并运行应用程序,以使用他们提供的示例Web api(https://aadb2cplayground.azurewebsites.net)演示登录。此Web api已通过使用名为“fabrikamb2c.onmicrosoft.com”的Azure AD租户进行保护。您可以通过访问该网站的根网址来查看此内容:

Screenshot of AADB2CPlayground

为了让示例在此站点上调用web api操作,您需要在其信任的受众发出的请求标题中向其发送OpenIDConnect访问令牌(JWT)。当使用B2C Azure刀片接口创建时,新的B2C应用程序接收的AppID表示受众。此外,访问令牌需要指定在对租户进行身份验证时使用的策略。

如果您在操场上点击“应用程序设置”然后“使用AAD B2C Playground示例目录”,您可以看到github样本仓库中预设的相同值:

AAD B2C Playground Settings

在您的方案中,您尝试使用SPA存储库来调用示例Web服务。显然,Playground网站对您的仓库一无所知,因此您需要提供设置,以便它知道如何针对您的租户验证您的令牌。我没有尝试过,但我想如果你用你自己的租户用适当的值填充App Settings输入,那么样本将起作用,因为Playground示例现在知道如何与你的租户沟通。

显然我不会在这里使用任何生产租户设置!

当您希望SPA应用程序访问您自己的WebAPI时,您需要使用自己的租户保护双方,但每个人都可以使用自己的B2C应用程序。如果使用包含WebAPI B2C应用程序的AppID和范围的令牌对SPA应用程序进行身份验证,则您将被授予访问权限,因为生成的令牌将使用WebAPI的受众值。

  

1)我认为acquireTokenSilent失败可能是由于我要求的“范围”。我查看了Azure文档并且不了解如何创建一个范围,所以我有点卡在那里。我可以使用默认值吗?我尝试了一个空字符串,但它失败了。我也尝试了https://myapp.onmicrosoft.com/demoapi/demo.read没有意义,但无论如何我都试过了(没有意义,因为我无法在任何地方看到它)。

对于范围,您需要将其设为“https://fabrikamb2c.onmicrosoft.com/demoapi/demo.read”。在FabrikamB2C租户上将有一个AppC为“https://fabrikamb2c.onmicrosoft.com/demoapi”的B2C应用程序,并且将定义一个名为“demo.read”的作用域,Playground站点在您的传入令牌中查找该作用域以确保您可以访问端点这需要您的令牌中定义的范围。

  

2)我想也许删除我的弹出窗口拦截器,它在每个浏览器中都是默认的,现在可能导致acquireTokenPopup工作。 INSTEAD:它仍然失败,但是当我调用loginPopup时它会打开两次登录窗口。是两次。我调试了代码以确保我没有两次调用loginPopup。我不是......

     

有人可以解释为什么在弹出窗口拦截器的时代,图书馆甚至会尝试这个代码吗?有人启用弹出窗口只是为了使用你的应用程序似乎非常古老......有没有办法解决这个库?

在进行身份验证时,往往会实现弹出窗口,以避免破坏用户在应用程序中的流程。如果令牌过期且没有有效的刷新令牌可供使用,则您的应用程序无法访问另一个令牌,因此必须要求用户再次进行身份验证。如果用户处于操作的中间(例如,保存数据),则可以在单独的窗口中恢复操作之外而不是强制重定向用户。但是,我对SPA实施并不熟悉,因此其他知识渊博的人可能会有更多有效的输入!