使用Azure AD B2C身份验证的Alexa技能将在一小时后过期



我目前正在构建一项由Azure功能(.NET Core/C#)和Azure AD B2C支持的Alexa技能,用于身份验证。

对于最初的设置,我使用的大多是这个arcticle中的说明。由于这篇文章是几年前写的,我不得不做一些修改。最后,我降落在以下配置上:

Azure Active Directory B2C

正如我提到的,我们正在使用AAD B2C进行身份验证。相关应用程序的用户可以注册并登录React应用程序。其想法是通过Alexa意图+话语为所述用户提供一个替代界面。

我在AAD B2C中创建了一个Alexa应用程序,具有以下设置:

属性

  • Web应用程序/Web API:是
  • 允许隐式流:是
  • 回复URL:我输入了Alexa技能设置提供的值(例如。https://pitangui.amazon.com/api/skil/link/...);有三种不同的。我还为我的azure功能应用程序添加了一个(这可能是不正确的。这是我在诊断其他早期问题时所做的工作的一部分);它的格式是:https://myfuncname.azurewebsites.net/.auth/login/aad/callback(我需要这个吗??)
  • 应用程序ID URI:https://myorg.onmicrosoft.com/alexa
  • 包括本机客户端:否

按键

我生成了一个应用程序密钥,我将其用作Alexa开发者控制台帐户链接部分的秘密。

许多在线示例都提到在此处设置明确的有效期为1或2年;然而,我根本没有任何选项(即没有到期选项),只有代码。这可能是问题的一部分吗

API访问

  • 已发布的作用域部分中,作用域的名称为user_impersonation。描述为"代表登录用户访问此应用程序"。完整范围值为:https://myorgsname.onmicrosoft.com/alexa/user_impersonation.

对于API访问,我必须在此处输入API条目:

  • 使用上述user_impersonation作用域的一个
  • 第二个标题为"访问用户配置文件",使用:
    • 为用户获取id_token(openid)
    • 为用户获取refresh_token(offline_access)

AAD B2C用户流

我使用的用户流允许注册和登录,它使用以下配置:

属性

其他

  • 启用JavaScript强制页面布局(预览):打开

代币寿命

  • 访问&ID令牌寿命(分钟):60
  • 刷新令牌生存期(天):14
  • 刷新令牌滑动窗口生存期:"已绑定">
  • 寿命(天):90

代币兼容性设置

  • 发行人(iss)索赔:https://<domain>/<b2c-tenant-guid>
  • 主题(子)声明:ObjectID
  • 表示用户流的声明:tfp

会话行为

  • Web应用程序会话生存期(分钟):1440
  • Web应用会话超时:正在滚动
  • 单点登录配置:租户
  • 注销请求中需要ID令牌:否

Azure功能验证中间件

对于Azure功能中的身份验证层,我正在使用上面提到的文章中描述的方法。

Alexa开发人员控制台

在Alexa方面,我有一个非常简单的技能设置,包括以下设置:

端点

我的端点使用HTTPS选项,默认区域设置为我的Azure Function App的处理程序函数的完全限定HTTPS端点。

证书设置为"我的开发端点是具有通配符的域的子域…">

帐户链接

账户链接设置概述如下:

  • 是否允许使用创建帐户或链接到…:切换打开
  • 允许用户在不链接帐户的情况下启用技能:打开或关闭
  • 允许用户从应用程序或网站中将其帐户链接到您的技能:关闭
  • 授权代码:启用
  • 授权URI:https://myorg.b2clogin.com/myorg.onmicrosoft.com/oauth2/v2.0/authorize?p=<sign-in-user-flow-policy-name>
  • 访问令牌URI:https://myorg.b2clogin.com/myorg.onmicrosoft.com/oauth2/v2.0/token?p=<sign-in-user-flow-policy-name>
  • 您的客户端ID:AAD B2C应用程序GUID
  • 你的秘密:在我的Alexa Skill应用程序的AAD B2C应用程序设置中生成的密钥(在上面的AAD B2B设置信息中提到)
  • 您的身份验证方案:HTTP Basic
  • 作用域:openidhttps://myorg.onmicrosoft.com/alexa/user_impersonation
  • 域列表:login.microsoftonline.commyorg.b2clogin.com注意:这可能是错误的,因为我不知道在这里放什么。上面的文章根本没有提到这个设置
  • 默认访问令牌到期时间:3600

注意:底部的Alexa重定向URLS是我在AAD B2C中为回复URL部分放入的内容。

问题

现在是最重要的部分,问题。一开始一切似乎都正常。。。我可以访问alexa.amazon.com并使用链接帐户(它将我重定向到我的AAD B2C驱动的登录屏幕)。一旦我链接了账户,我就能成功地利用一句话并收到回复。

当我等了一个小时(我相信是一个小时),问题就开始了。当尝试验证验证令牌时,尝试在一小时后启动Intent会在Azure Function应用程序方面产生错误。

有人能为我提供一些指导吗?我可能设置错误了什么,或者至少应该调查一些事情?正如我在这个问题开始时提到的,我在网上找到的许多参考资料都已经过时了,并没有涵盖我应该使用的所有设置。与b2clogin.com相比,他们中的许多人仍在使用microsoftonline.com权限。

乍一看,我认为问题是Alexa技能在一小时后到期后无法刷新其代币。我需要做些什么来确保它正确刷新

我认为我现在有足够的信息来回答我自己的问题。我发现offline_access作用域对于令牌刷新是必要的。

根据Microsoft,"offline_access作用域允许您的应用程序在较长时间内代表用户访问资源。在同意页面上,此作用域显示为"维护对您授予其访问权限的数据的访问权限"权限。当用户批准offline_access作用域时,您的应用程序可以从Microsoft身份平台令牌终结点接收刷新令牌。刷新令牌是长期存在的。旧的访问令牌过期时,应用程序可以获得新的访问令牌。">.

你可以在这里阅读更多关于它的信息。

为了解决这个问题,我确保这个范围在AAD B2C中可用,并将其添加为Alexa开发者控制台中的引用范围。

感谢您对offline_access的深入了解。花了几个小时才弄清楚如何实现offline_access。有趣的是offline_access仅适用于Azure AD、OAuth 1.0端点,而不适用于2.0。

在尝试2.0时,当Alexa配置中提到多个作用域时,它在帐户链接时不断失败。我试过的范围如下。

  • https://samplealexabackendapi/
  • https://graph.microsoft.com/offline_access

最后,我使用了OAuth 1.0端点,并使用了https://samplealexabackendapi/.default其考虑注册的应用程序可用的所有作用域。

最新更新