【问题标题】:Infinite loop when calling WebApi from WebApp using OpenIDConnect AAD authentication使用 OpenIDConnect AAD 身份验证从 WebApp 调用 WebApi 时出现无限循环
【发布时间】:2017-06-12 13:19:12
【问题描述】:

我正在尝试关注示例WebApp-WebApi-OIDC,但在调用 WebApi 时,它在身份验证期间陷入了无限循环。 MVC TodoListController 中的以下代码会导致这种奇怪的行为:

if (Request.QueryString["reauth"] == "True") {
    HttpContext.GetOwinContext().Authentication.Challenge(
      new AuthenticationProperties(),
      OpenIdConnectAuthenticationDefaults.AuthenticationType);
}

我也尝试了 SystemWebCookieManager 解决方法,但没有帮助。

是否存在已知错误或我没有正确实施?

谢谢!

【问题讨论】:

    标签: azure azure-web-app-service azure-active-directory openid-connect adal


    【解决方案1】:

    代码示例很适合我。您上面提到的代码是在代码捕获AdalException 时执行的。

    哪一行代码导致了这个问题?您是否也遇到了您在此post 中提到的此代码示例中的 TokenCache 问题?

    请确保您可以成功获取TodoListController中的token。

    【讨论】:

    • 该应用程序适用于所有区域,如关于、主页、个人资料、联系人、登录和注销。待办事项列表除外。当我从 UI 中单击此链接时,它会显示 查看待办事项列表所需的登录 和一个登录链接。当我单击该链接时,它会陷入无限循环并且永远不会回来。所以我认为这与我遇到的问题不同,因为 Profile 和其他区域工作正常。
    • 忘了提到我正在使用建议的 ADAL nuget 包版本。所以我不认为这是同一个问题,因为它适用于使用 SessionCache 并成功获取和存储令牌的其他领域。
    • 经过更多调试,我发现result = await authContext.AcquireTokenSilentAsync(todoListResourceId, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId)); 总是失败并抛出异常。 catch 块将其发送到 login 并且 OIDC 中间件再次返回到同一个控制器。这种情况一直在继续。基本 AdalException 的内部异常是 AADSTS65001:用户或管理员未同意使用 ID 为“xx-xx”的应用程序。为此用户和资源发送交互式授权请求。
    • 在添加 Windows AAD 后摆脱了上述错误 > 对网站应用程序读取目录数据权限。现在我可以静默获取令牌,但 Api 调用仍然无法返回未经授权的响应作为状态码。
    • 通过更改 Web 配置文件中使用的 Api App ID 格式来修复它。是通过 NaiveSessionCache 将令牌存储在 Session 中,还是有更好的替代方案或设计考虑?
    【解决方案2】:

    以下是我为任何感兴趣的人解决此问题所采取的步骤:

    • 我利用 System.Web cookie 而不是依赖默认的 Owin cookie 实现。详情here
    • 确保您没有引用有缺陷的 ADAL.net nuget 包。请参阅此post 中提到的版本。
    • 为与您的 Web 应用程序关联的 AAD 应用程序配置适当的权限。这是我配置的两个:
      • 以委托权限访问 TodoListService。
      • 作为应用程序权限读取 Windows Azure Active Directory 的目录数据。
    • 确保todo:TodoListResourceid appsettings 键的网站配置文件中的 AppId 与您在与 todoList webapi 服务关联的 AAD 应用程序中配置的内容匹配。并且也应该与您在 VS WebApis 项目ida:Audience appSetting 中指定的相同。 我使用的格式是
    https://{tenant}/{appName}
    

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 2020-10-14
      • 2016-09-20
      • 2020-07-06
      • 2019-06-09
      • 2018-04-16
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多