场景

  • 带有IdentityServerAuthentication的ASP.NET核心MVC(API),带有oidc-client-js的Angular 2 . IdentityServer4,带有ASP.NET核心标识,作为OP . 使用红隼

  • nginx反向代理 - SSL终止,基本身份验证

  • oidc隐式流

认证流程如下:

  • 浏览器导航到应用程序

  • 浏览器中的基本身份验证

  • Angular路线保护通知(通过oidc-client)用户未登录(或401被 grab )

  • App导航到 unauthorized 路线

  • 用户点击 sign in 按钮,触发UserManager(oidc-client) signinRedirect

  • 浏览器重定向到OP(IdentityServer4)

  • 用户在OP登录

  • 重定向到app signin-callback - 即UserManager signinRedirectCallback

  • 基本身份验证弹出窗口 - 因为oidc-client使用Bearer授权标头调用 connect/userinfo .

问题

用户现在停留在步骤9上 . 呼叫永远不会使用基本身份验证标头(或者更确切地说:两个标头组合在一起) . 用户只能取消,然后在请求到userinfo endpoints 时产生401,让他们在应用程序中注销 .

重复尝试将跳过步骤5,因为OP上的登录会话cookie仍然存在 .

我不完全确定浏览器如何处理基本身份验证,尤其是对js / angular的请求 . 这可能是 oidc-client-js 中的错误吗?

我猜我们的应用程序经过身份验证的HTTP请求必须检查是否已经存在授权并向其添加承载令牌(逗号分隔的授权标头,但只有一个这样的标头) . 如果还没有发送授权标头,我们已经附加了带有承载令牌的Authorization标头 - 但是我无法真正尝试这一点,因为这种情况甚至不能进行足够的进行这样的api调用 .

未设置基本身份验证时,一切正常

我在开发期间使用本地nginx来测试HTTPS重定向,检测SSL终止 - 以及添加基本身份验证时的行为 .

没有基本身份验证,一切正常 . X-Forwarded-ForX-Forwarded-Proto 标头被正确解释,HTTP被重定向到HTTPS等 .

为什么甚至需要基本身份验证?

我们不希望公开申请 . 最近添加了基于OIDC的身份验证,以及强制执行HTTPS等(应用程序尚未投入 生产环境 )