问题标签 [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 回答
6784 浏览

identityserver4 - 如何将多个 acr_values 传递给 IdentityServer?

我有一个 IdentityServer4 和一个 javascript 客户端,它使用 oidc-client.js 库对我的 IdentityServer 进行身份验证。我有一个特定的情况,我需要同时传递 acr 值:idp:{providerName}tenant:{tenantName}. 在配置对象中使用 oidc-client.js 库,我将 arc_values 字符串传递为 oracr_values: "tenant:lado"acr_values: "idp:Google"。如果我尝试发送一个字符串列表acr_values: ["idp:Google","tenant:lado"]并尝试在 IdentityServer 中访问它,我只会得到租户并且它的值是:Google,tenant:lado。如您所见,仅检测到 idp,但它合并了所有内容。如何达到发送 2 个单独的 acr_values 的预期效果?

0 投票
2 回答
1068 浏览

c# - 静默刷新在 OPTIONS 预检上进行身份验证,但不在 GET 到 UserInfo 端点上进行身份验证

环境:

基本的令牌发行和验证在我们的环境中运行良好。我现在正在尝试启用静默刷新技术(如此所述)。在启用automaticSilentRenew和短之后AccessTokenLifetime,我可以看到在我的浏览器控制台中触发的静默请求,正如我所期望的那样。

我可以看到对 IS4 的 UserInfo 端点的两个后续调用(见下面的屏幕截图)。第一个是 CORS 预检OPTIONS请求。在我的自定义实现的断点处IProfileService.IsActiveAsync(),我可以看到这个请求成功地通过了身份验证(通过检查httpContext)。

在此处输入图像描述

但是,对 UserInfo 端点的第二个请求 ( GET) 不会进行身份验证。我的断点IProfileService.IsActiveAsync()显示没有用户经过身份验证,因此我用于验证用户是否处于活动状态(调用另一个 API)的例程返回 false,它被转换为 401。我可以在失败的GET请求上看到此标头WWW-Authenticate: error="invalid_token"

我尝试指定一个IdentityTokenLifetime小于AccessTokenLifetimeper this的值,但没有成功。

以下是两个请求的日志:

问题:

如何GET在静默刷新期间获取对 UserInfo 端点的请求以进行身份​​验证HttpContext

更新:

添加两个请求的所有标头和生成的浏览器 cookie 的屏幕截图,以调查 @Anders 的答案。

<code>OPTIONS</code> 对 UserInfo 端点的请求 <code>GET</code> 对 UserInfo 端点的请求 在浏览器中生成 cookie

0 投票
1 回答
1511 浏览

nginx - 带有 vuex-oidc 的 Vue.js SPA 在发布版本上有重定向循环

我有一个在 Vue.js 2.5 中构建的单页应用程序,它还使用 IdentityServer4 + vuex-oidc 支持 OAuth2.0,并在 nginx 服务器上运行。在 webpack dev server上运行应用程序,我的设置一切正常,但发布版本存在重定向循环问题,我高度怀疑这可能是由于 nginx 配置错误。

问题:重定向循环行为始终相同

  1. 用户请求导航到 /app
  2. oidc 插件重定向到 /connect/authorize?...
  3. 重定向到 /app/oidc-login(授权请求的重定向 uri)
  4. 重定向到 /app(返回第 2 步)

对于开发服务器,我使用配置为的反向代理

但是由于我在路由器中使用历史模式,所以发布版本是按照https://router.vuejs.org/guide/essentials/history-mode.html#example-server-configurations配置的

应用程序的发布版本(index.html 和静态文件)位于..\nginx\html\app

这是我的 vue-router 配置

OidcCallback 组件是

我几乎完全按照https://github.com/perarnborg/vuex-oidc/wiki#how-to-implement-vuex-oidc中的说明配置了 vuex-oidc,只是我将 oidcStore 模块动态添加到 vuex。

由于一切都在开发服务器中正常工作,而且我已经认为这是一个 nginx 问题,我不确定提供我的代码/设置的其他部分是否会有所帮助,但请让我知道,以防我遗漏了什么,我会分享更多。

谢谢

0 投票
2 回答
10138 浏览

angular - 登录后 Identity Server 4 未重定向到 Angular 应用程序

我正在使用oidc-client角度。按照本教程

我的客户:

在身份服务器中我正在使用Assembly Microsoft.AspNetCore.Identity.UI, Version=2.1.3.0

我正在添加这样的默认身份:

WebAppUser来源于IdentityUser

启动.cs:

在身份服务器 4 中,我启用了https. 所以问题是,如果我尝试使用受保护的 Angular 应用程序,我将URL导航到身份服务登录页面。看起来它正在对数据库中的用户进行正确的身份验证。但它只是刷新登录页面而不重定向到回调URL

这里有一些日志可能会有所帮助

2019 - 03 - 07 01: 19: 30.553 - 06: 00[INF] 开始 IdentityServer4 版本 2.3 .2 .0 2019 - 03 - 07 01: 19: 30.632 - 06: 00[INF] 您正在使用内存中的版本的持久授权存储。这将仅在内存中存储同意决策、授权代码、刷新和引用令牌。如果您在生产中使用这些功能中的任何一个,您希望切换到不同的存储实现。2019 - 03 - 07 01: 19: 30.643 - 06: 00 [INF] 使用 IdentityServer 的默认身份验证方案 idsrv 2019 - 03 - 07 01: 19: 30.644 - 06: 00 [DBG] 使用 idsrv 作为默认 ASP.NET Core身份验证方案 2019 - 03 - 07 01: 19: 30.644 - 06: 00 [DBG] 使用 Identity.External 作为默认 ASP.NET Core 方案进行登录 2019 - 03 - 07 01: 19: 30.645 - 06: 00 [ DBG] 使用 Identity.External 作为默认 ASP。授权请求中没有用户 2019 - 03 - 07 01: 19: 31.945 - 06: 00[DBG] 开始授权请求协议验证 2019 - 03 - 07 01: 19: 31.983 - 06: 00[DBG] 客户端的客户端配置验证angular_spa 成功了。2019 - 03 - 07 01: 19: 32.069 - 06: 00 [DBG] 调用自定义验证器:IdentityServer4.Validation.DefaultCustomAuthorizeRequestValidator 2019 - 03 - 07 01: 19: 32.099 - 06: 00 [INF] ValidatedAuthorizeRequest {“ClientId”: “angular_spa”、“ClientName”:“Angular 4 客户端”、“RedirectUri”:“ http://localhost:4200/auth-callback ”、“AllowedRedirectUris”:[“ http://localhost:4200/auth-callback ” , " http://localhost:4200/silent-refresh.html"], "SubjectId": "anonymous", "ResponseType": "id_token token", "ResponseMode": "fragment", "GrantType": "implicit", "RequestedScopes": "openid profile api1", "State": “cd6df66e397546d3aab62533de28a2d2”,“UiLocales”:null,“Nonce”:“8b3af6331d784e9a9cad076555f16174”,“AuthenticationContextReferenceClasses”:null,“DisplayMode”:null,“PromptMode”:null,“MaxAge”:null,“LoginHint”:null,“SessionId” ": null, "Raw": { "client_id": "angular_spa", "redirect_uri": " http://localhost:4200/auth-callback取消保护票证失败 2019 - 03 - 07 01: 19: 40.844 - 06: 00[INF] idsrv 未通过身份验证。失败消息:取消保护票证失败 2019 - 03 - 07 01: 19: 41.517 - 06: 00[INF] AuthenticationScheme: Identity.Application 已登录。2019 - 03 - 07 01: 19: 41.518 - 06: 00[INF] 用户登录。2019 - 03 - 07 01: 19: 41.528 - 06: 00 [INF] idsrv 未通过身份验证。失败消息:取消保护票证失败 2019 - 03 - 07 01: 19: 41.528 - 06: 00 [INF] idsrv 未通过身份验证。失败消息:取消保护票证失败 2019 - 03 - 07 01: 19: 41.528 - 06: 00 [DBG] 请求路径/连接/授权/回调匹配到端点类型授权 2019 - 03 - 07 01: 19: 41.529 - 06: 00 [DBG] 端点启用:授权,成功创建处理程序:IdentityServer4.Endpoints.AuthorizeCallbackEndpoint 2019 - 03 - 07 01: 19: 41.529 - 06: 00[INF] 调用 IdentityServer 端点:IdentityServer4.Endpoints.AuthorizeCallbackEndpoint 用于/连接/授权/回调 2019 - 03 - 07 01: 19: 41.535 - 06: 00 [DBG] 开始授权回调请求 2019 - 03 - 07 01: 19: 41.536 - 06: 00 [INF] idsrv 未通过身份验证。失败消息:取消保护票证失败 2019 - 03 - 07 01: 19: 41.541 - 06: 00 [DBG] 授权请求中没有用户存在 2019 - 03 - 07 01: 19 : 41.541 - 06: 00 [DBG] 开始授权请求协议验证 2019 - 03 - 07 01: 19: 41.541 - 06: 00 [DBG] 客户端 angular_spa 的客户端配置验证成功。2019 - 03 - 07 01: 19: 41.541 - 06: 00 [DBG] 调用自定义验证器:IdentityServer4.Validation.DefaultCustomAuthorizeRequestValidator 2019 - 03 - 07 01: 19: 41.541 - 06: 00 [INF] ValidatedAuthorizeRequest {“ClientId”:http://localhost:4200/auth-callback ", "AllowedRedirectUris": [" http://localhost:4200/auth-callback ", " http://localhost:4200/silent-refresh.html "], " SubjectId”:“anonymous”,“ResponseType”:“id_token token”,“ResponseMode”:“fragment”,“GrantType”:“implicit”,“RequestedScopes”:“openid profile api1”,“State”:“cd6df66e397546d3aab62533de28a2d2”, “UiLocales”:null,“Nonce”:“8b3af6331d784e9a9cad076555f16174”,“AuthenticationContextReferenceClasses”:null,“DisplayMode”:null,“PromptMode”:null,“MaxAge”:null,“LoginHint": null, "SessionId": null, "Raw": { "client_id": "angular_spa", "redirect_uri": " http://localhost:4200/auth-callback”,“response_type”:“id_token token”,“scope”:“openid profile api1”,“state”:“cd6df66e397546d3aab62533de28a2d2”,“nonce”:“8b3af6331d784e9a9cad076555f16174”},“$type”:“AuthorizeRequestValidationLog”} 2019 - 07 01: 19: 41.541 - 06: 00 [INF] 显示登录:用户未通过身份验证 2019 - 03 - 07 01: 19: 41.552 - 06: 00 [INF] idsrv 未通过身份验证。失败消息:取消保护票证失败 2019 - 03 - 07 01: 19: 41.553 - 06: 00 [INF] idsrv 未通过身份验证。失败消息:取消保护票证失败 2019 - 03 - 07 01: 19: 41.553 - 06: 00 [INF] AuthenticationScheme: Identity.External 签名出去。

抱歉,我尝试正确格式化日志,但没有奏效。

更新

我的服务器端配置看起来像这样

我的项目结构看起来像这样

在此处输入图像描述

它没有任何控制器。应该有吗?

更新 2 看起来我想出了什么问题。

returnUrl方法没有正确解决POST。它是完整的URL。如果我强迫它正确返回URL它会起作用

在此处输入图像描述

我按照上面的方法做了,并在重定向函数中使用了变量'redirect_uri'。它有效,但它看起来像一个黑客。它应该自动得到正确的东西吗?

有了这个,我在 Angular 端收到“无响应状态”错误,oidc-client重定向后没有用户。

更新

看起来我正在使用一些不同的nuget包。 HttpContext.SignInAsync有以下构造函数。

我的HttpContext似乎被定义在

Microsoft.AspNetCore.Mvc.RazorPages

看起来我有错误的 Nugets 或其他东西。我也在尝试提供适当的 ClaimsPrincipal 但不工作。

在此处输入图像描述

0 投票
0 回答
171 浏览

identityserver4 - ValidateAntiForgeryToken 阻止新登录

我有一个非常简单的身份服务器 4 实现,我正在使用oidc-client我的 Angular APP 进行所有安全管理。在我的身份验证服务中,我有以下内容:

一切都像一个魅力,所以我可以登录/退出没有任何问题,令牌更新按预期工作,到目前为止一切都很好。但是,当用户在同一浏览器的多个选项卡中打开应用程序并且其中一个注销时,我决定实现“自定义”行为。然后触发 UserSignedOut 事件,然后我退出可能打开的其余选项卡。我遇到的问题是,当用户返回时,第一次登录尝试正确执行,但是来自任何其他选项卡的任何后续登录请求都会导致 400 - BAD REQUEST(从我的 IS4 中的登录方法中删除 Antiforgery 令牌属性然后它可以工作,但我不想这样做)。

如果您确实刷新了选项卡,那么您就会登录,因此对我来说,实际状态本身似乎有问题?

我不确定是否应该在注销之前调用 AuthService 中的任何其他方法,或者是否应该为此使用自定义行为重新实现 ValidateAntiForgeryToken。

非常感谢任何帮助,谢谢!

0 投票
1 回答
2654 浏览

reactjs - 如何在反应应用程序中使用oidc客户端进行身份验证后重定向

我正在尝试使用身份服务器 4 为我的反应应用程序进行身份验证。我遵循了这个文档。我正在使用身份服务器的隐式流程,因此 onload 应用程序将转到身份服务器的登录页面。提供正确的用户名和密码后,它将验证并提供令牌。一切都按预期工作,但我无法将我的反应应用程序重定向到仪表板页面。我很新反应请帮助我。

我面临的问题是在身份验证后我的应用程序正在进行某种循环意味着应用程序的 url 正在更改为身份服务器和本地应用程序 url。您可以看到我的应用程序之前使用的是 adal 的 AuthenticationContext。我想更改为 oidc身份服务器 4.

0 投票
1 回答
189 浏览

oauth - 将经过身份验证的用户转移到 SPA,而不强制他们重新输入凭据

这是我目前的设置:

  • 身份服务器4
  • API(承载认证)
  • SPA 页面(oidc-client 隐式流重定向到 IdentityServer4 快速入门 UI)
  • 本机应用程序(用 C# 编写)

本机应用程序已经拥有用户凭据。我想从本机应用程序提供到 SPA 页面的 Web 链接,但我不想在导航到 Web 时强制用户再次登录。相反,我想将他们当前的会话移动到网页。

是否可以将访问令牌“注入”到 oidc-client 中?(使用 url 片段)。或者是否有任何其他流程或方法可以使这项工作?

0 投票
1 回答
2686 浏览

oidc-client-js - 如何使用 oidc-client 和 Angular 获取日志记录

我正在使用带有角度 7 的 oidc-client,并且我想启用日志记录。该文档建议我可以执行以下操作

我无法完成这项工作,因为 Oidc 似乎不在窗口对象上??

0 投票
2 回答
2637 浏览

identityserver4 - SilentRenewService._tokenExpiring:signinSilent 出错:帧窗口超时 t.error

我正在学习使用 OpenID Connect 和 OAuth2 保护 Angular 应用程序的复数课程,以便在 Angular 中使用 oidc-client 启动和运行,但我遇到了静默刷新令牌的问题,它会抛出

SilentRenewService._tokenExpiring:signinSilent 出错:帧窗口超时 t.error

在服务器上客户端是

客户端上的配置是:

我在这里找到了针对类似问题的“Sohan”建议的解决方案(这专门针对 azure AD)。这会导致

帧窗口超时

或者这篇文章中的建议我应该将silent-redirect.html的引用添加到我的angular.json文件中,这没有帮助

我正在使用 Angular 7 及更高版本Chrome Version 73.0.3683.86 (Official Build) (64-bit)

0 投票
1 回答
441 浏览

javascript - 使用 oidc-client-js 和 Apereo CAS 验证访问令牌失败

我正在尝试使用OIDC在我的反应应用程序中使用 Apereo CAS 5.1.1登录。寻找库来实现这一点,我登陆oidc-client-js 1.7.0,但我遇到以下错误:

ResponseValidator._validateAccessToken:无法验证 at_hash dWr5-bD5lv8C1x3VcfFn1Q dWr5+bD5lv8C1x3VcfFn1Q==

跟踪跟踪,我找到了引发异常的位置

问题是this._joseUtil.hexToBase64Url(a)不添加填充(=),在这种特殊情况下是+符号。这是因为 URL 中不接受这些字符。因此,比较总是(或几乎总是)将是错误的。例如,在此执行中:

另一方面,我认为我的应用程序中缺少或配置错误的东西,因为否则每个使用这个库的人都会遇到同样的问题。

所以,我的问题是:如何在这种情况下成功验证访问令牌?

谢谢。