问题标签 [oidc-client-js]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
426 浏览

asp.net-mvc - 具有基于 Cookie 的外部身份提供者登录和令牌委托的单页应用程序

如何使用第三方开放 ID 连接提供程序(例如 Google 或 Microsoft)为单页面应用程序创建无缝登录流程,然后从外部提供程序返回的现有令牌生成新的 jwt 令牌而不刷新页面?

例如,我希望用户能够登录 Google,然后被带回我的站点,在那里我使用 IdentityServer4 验证令牌服务器端,然后提取某些声明并生成新的 JWT(我自己的逻辑)。

是否有一个现有的 IdentityServer4 端点在重定向时验证来自 Open Id 提供者的 JWT 令牌,然后注入我自己的令牌创建流程的最佳方法是什么?最终结果是一个理想的 cookie,其中包含我的新 JWT 令牌,现在将在我的 SPA 发出的每个 http 请求上发送。

我最好的猜测是使用 oidc js 客户端并为 Google 设置一个用户管理器,例如:

但是,在重定向时,我需要 Google 向我的控制器发送一个 cookie,然后控制器将使用 IdentityServer 验证令牌,提取一些声明,如用户 ID,然后为我的 API 生成一个新令牌。这假设我正在使用 IdentityServer 来托管我自己的身份提供者。我如何使用 IdentityServer4 来完成最后一部分?

这对于 MVC 模式来说很简单,因为令牌是在调用重定向回调之后在回发时生成的。在 SPA 中,应该有最少的重定向,理想情况下没有显示弹出窗口以允许用户登录,然后 SPA 接管。我一直无法弄清楚如何从外部身份提供者重定向到我的 IdentityServer4 身份验证服务器或 MVC 服务器,并生成一个新令牌,同时最大限度地减少对事实上的配置的干扰。

Google 建议服务器必须验证令牌 ( https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token )。一种可能的解决方案是在验证后在重定向回调中生成我的新令牌。但是,IdentityServer4 不应该验证令牌,还是我必须自己在服务器上执行此操作?IdentityServer4 在令牌验证中扮演什么角色。我不想自己编写这一步的代码。

0 投票
1 回答
353 浏览

identityserver4 - 使用 OIDC 客户端和 IdentityServer4 将外部身份提供者令牌与内部身份提供者令牌交换

在使用 IdentityServer4 和 OIDC-Client 的 SPA 环境中,与多个外部提供商一起执行以下操作的最安全方法是什么?

本质上,如果用户使用 Google 登录,我需要登录我的内部系统并创建新的声明。这必须在服务器端后第三方回调中完成。在 SPA 中执行此操作的 IdentityServer4 中最安全的配置是什么?

流动:

  1. 用户在 SPA 中登录 Google(调用 oidcManager.signinRedirect)
  2. Google 重定向回 SPA(cal new Oidc.UserManager().signinRedirectCallback)
  3. 将 JWT 发送回 IdentityServer4(但使用哪种机制?)。如果用户确实存在于内部系统中,则返回一个新的 JWT,其中包含 OIDCManager 可以管理的自定义声明(替换外部声明)。如果用户在内部系统中不存在,则重定向到资源所有者凭据流接管的登录页面。

对于#3,我喜欢使用 IdentityServer4 已经提供的东西,而不是滚动我自己的端点。这种情况容易支持吗?

本质上,我需要完成此操作,但不确定 IdentityServer4 将如何处理这种情况:

除了登录流程之外,使用多个外部提供商进行令牌刷新的最安全方法是什么。我假设我需要定期刷新外部令牌,以防我自己的内部令牌过期。

0 投票
1 回答
71 浏览

ecmascript-6 - javascript 嵌套异步调用

我的脚本具有如下登录用户的功能:

如您所见,有两个嵌套的 Promise。用户只有在解决了最里面的承诺后才登录系统(即manager._loggedUser = user:)

现在,我希望我的班级只公开两种方法:SignIn() [如上所述] 和 GetUserInfo():

因此,任何使用我的班级的人都只需要按照以下步骤来获取登录的用户个人资料:

  1. 创建对象
  2. 调用登录方法
  3. 获取用户信息

我如何“同步”第二步和第三步,以确保在首先调用 signin() 方法和之后调用 GetUserInfo() 后 _loggedUser 不为空?

0 投票
2 回答
2101 浏览

angular - 将 OAuth2 访问令牌配置为 typescript-angular2 客户端

我不完全了解如何将 OAuth2 访问令牌从 Promise (oidc-client-js) 提供给使用 Swagger-CodeGen 生成的 API 代码。

提供常量值很容易,但是如何在下面进行更改以从 oidc-client-js 获取用户的访问令牌?我想知道“正确”的方式。将这个标记粘贴在全局变量中的某个位置会很容易。

在使用 OnInit 的普通组件中,我可以从 oidc-client 的 UserManager 实例中获取承诺中的令牌。让这两个部分结合在一起让我感到困惑。一个看起来像静态配置,另一个需要订阅单例的承诺。

对我做错的事情的任何更正也将不胜感激。这是我第一个使用 Angular 的原型。


更新

在应用 Ben 的建议并花时间了解 APP_INITIALIZER(标记为实验性且 imo 记录非常稀少)之后,感觉有点矫枉过正。我以 Configuration 类的以下自定义提供程序结束,该提供程序被注入到使用 Swagger-CodeGen 生成的 TypeScript-Angular2 服务代码中:

我更改了我的 AuthService 以将用户的最新 access_token 存储在服务上。该getAccessToken()方法从 Swagger-CodeGen 生成的代码中调用,并返回最新的 jwt 以用于 HTTP 标头。感觉很干净,而且很有效。如果(以及为什么)这是解决我的问题的错误方法,请告诉我。

0 投票
0 回答
871 浏览

asp.net-core - oidc-client-js 和基本身份验证

设想

  • 带有 IdentityServerAuthentication 的 ASP.NET Core MVC (API),带有oidc-client-js 的Angular 2 。IdentityServer4,带有 ASP.NET Core Identity,作为 OP。使用红隼
  • nginx 反向代理 - SSL 终止,基本身份验证
  • oidc 隐式流

认证流程如下:

  1. 浏览器导航到应用程序
  2. 浏览器中的基本身份验证
  3. Angular 路由保护通知(通过 oidc-client)用户未登录(或 401 被捕获)
  4. 应用导航到unauthorized路线
  5. 用户点击sign in按钮,触发 UserManager (oidc-client)signinRedirect
  6. 浏览器被重定向到 OP (IdentityServer4)
  7. 用户在 OP 登录
  8. 重定向到应用登录回调 - 即 UserManagersigninRedirectCallback
  9. 基本身份验证弹出窗口 - 因为 oidc-client 调用connect/userinfo带有承载授权标头。

问题

用户现在停留在第 9 步。调用永远不会使用基本身份验证标头(或者更确切地说:两个标头组合)。用户只能取消,然后对 userinfo 端点的请求产生 401,让他们在应用程序中退出。

重复尝试将跳过第 5 步,因为在 OP 处登录的会话 cookie 仍然存在。

我不完全确定浏览器如何处理基本身份验证,尤其是在从 js/angular 发出的请求上。这可能是一个错误oidc-client-js吗?

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

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

我在开发过程中使用本地 nginx 来测试 HTTPS 重定向、SSL 终止检测 - 以及添加基本身份验证时的行为。

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

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

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

0 投票
1 回答
1538 浏览

javascript - 使用 oidc-client.js 的检查会话的 CSP 问题

我正在使用 oidc-client 构建一个 SPA,以登录到使用 Identity Server 4 构建的 IDP。

登录重定向似乎工作正常,但在 Firefox 上我遇到了以下 CSP 问题

在此处输入图像描述

我没有在我的 SPA 上设置任何 CSP 元标记,我想知道是否必须这样做。稍微挖掘一下,似乎 oidc-client 正在我的应用程序中添加一个 iframe,它指向 Identity Server 中的 checksession 页面(其中确实包括 CSP 标头“default-src 'none'; script-src 'unsafe-inline' ” sha256-VDXN0nOpFPQ102CIVz+eimHA5e+wTeoUUQj5ZYbtn8w='")

有人可以帮我解决这个问题或引导我走向正确的方向吗?我对 CSP 的了解非常基础。

0 投票
6 回答
10920 浏览

c# - IdentityServer4 PostLogoutRedirectUri null

我正在尝试让隐式流程为 IdentityServer4 工作。登录和注销工作正常,但是 PostLogoutRedirectUri 返回 null,尽管设置了需要设置的值。我想要的是注销过程在注销完成后重定向回我的应用程序。

我正确获取了 logoutId,并且 Logout 调用了 BuildLoggedOutViewModelAsync:

这个方法位于我的AccountService.cs类中,然后调用DefaultIdentityServiceInteractionService的GetLogoutContextAsync:

这会创建一个 IdentityServer4.Models.LogoutRequest。

SignOutIFrameUrl字符串属性设置为,但"http://localhost:5000/connect/endsession/callback?sid=bf112f7785bc860fcc4351893012622e&logoutId=d6649e7f818d9709b2c0bc659696abdf"LogoutRequest 中似乎没有填充任何其他内容。

不幸的是,这意味着PostLogoutRedirectUri是空的,而AutomaticRedirectAfterSignOut也是空的,当LoggedOut.cshtml页面加载时,signout-callback.js文件永远不会加载:

这是我的配置设置。

配置文件:

app.ts(js客户端):

Startup.cs 的相关部分:

在找出我哪里出错的任何帮助将不胜感激。

谢谢!

0 投票
1 回答
585 浏览

node.js - 是否有为 IdentityServer4 实现 Node.js 的混合工作流的客户端库?

我知道 IdentityServer4 有一个名为oidc-client.js的 JavaScript 客户端,但它实现了隐式流程。我需要一些可以实现混合混合+PKSE流程的东西。首先,是否有实现此流程的客户端库(假设 Node.js 在服务器级别运行在 Google V8 引擎上而不是在浏览器中)?其次,Node.js 服务器是否仅限于隐式流?第三,这是否重要,因为我们正在谈论不需要创建“反向通道”来获取访问令牌的服务器到服务器?

0 投票
0 回答
341 浏览

oauth - IdentityServer 3 未验证秘密,“invalid_client”响应:隐式流,撤销端点

我在针对 IdentityServer3 的 SPA 应用程序中使用 oidc-client,使用隐式流。

注销时撤销我的参考令牌不起作用。

我已将 revokeAccessTokenOnSignout: true 和 client_secret 设置为虚拟机密,并且我看到请求已发送出去。但是我收到“400 bad request invalid client”响应。这是正在发送的请求:

在此处输入图像描述

这是回应: {"error":"invalid_client"}

这是 IdentityServer 配置:

有什么想法我可能做错了吗?

0 投票
0 回答
599 浏览

asp.net-identity - IdentityServer4 与 aspnet 身份和 javascript 客户端

我正在尝试实现 IdentityServer4。所有客户端都将是 javascript 应用程序(在 react js 中)。我的问题是:

1.- 我们将拥有我们的自定义用户数据库,因此我正在尝试使用 Aspnet 身份实现 de IS4,例如 de 6th example。但是,由于我的客户端是基于 Javascript 的,我必须使用隐式流,并且在示例中(就像使用 MVC 客户端完成的那样)是在考虑 HybridAndClientCredentials 的情况下制作的。此外,MVC 登录应用程序似乎不包括同意步骤。我结合 AspnetIdentity 示例实现了 javascript 客户端示例。起初它给了我错误:IdentityServer4.Validation.ScopeValidator: Error: Invalid scope: api2, (api2 它是客户端将调用的 Api),但 api2 包含在客户端定义中:

只是为了继续前进,我从客户端调用中删除了该范围,并且它起作用了。我登录了,但由于缺少同意步骤,客户端崩溃了。

错误图片

所以,我想我在这里有点迷路了。我应该找到一种方法来跳过 conset 步骤吗?(这很好,因为我们不希望这一步,所有用户都将是内部的)。

2.- 我们还需要在数据库中保留示例 8_EntityFrameworkStorage 中的所有结构。我可以将这种方式与 AspIdentity 结合使用吗?

参考的样本:https ://github.com/IdentityServer/IdentityServer4.Samples

非常感谢您的阅读。