当前位置: 首页 > 知识库问答 >
问题:

调用SignInDirect时的Oidc客户端无限循环

黄弘盛
2023-03-14

我将angular 8与oidc客户端js一起使用。我已连接到IdentityServer4(代码流PKCE)。在我打开应用程序(在主组件内)后,我想检查用户是否经过身份验证。这就是我调用SignInDirect()的原因。我没有手动单击按钮,而是在构造函数内部调用它(当我单击按钮调用SignInDirect()时,整个流程都起作用)。问题是我被困在无限循环中。Angular一直在调用IdenityServer并刷新登录页面。对服务器的api调用(结果重定向到登录页面)工作正常,但不会停止。请帮忙。

export class AuthService {
  private userManager: UserManager;
  private user: User;

  constructor(private client: HttpClient) {
    this.userManager = new UserManager(AuthSettings.settings);
    this.userManager.getUser().then(user => {
      this.user = user;
    });
  }

  checkCredentials() {
    if (!this.isUserLoggedIn()) {
      this.redirectToLogin();
    }
  }

  redirectToLogin() {
    return this.userManager.signinRedirect();
  }

  isUserLoggedIn(): boolean {
    return this.user != null && !this.user.expired;
  }
}
export class AppComponent {
  title = "app";

  constructor(private authService: AuthService) {
    this.authService.checkCredentials();
  }
}

用户进入angular应用程序。然后我调用authorize endpoint(SignInDirect,发送代码流中所需的服务器内容)——如果用户登录,服务器将检查cookie。如果没有,它会将我重定向到登录页面。问题是,如果我单击一个调用(SignInDirect)的按钮,而不是在组件打开时执行该按钮,则该场景可以工作。循环以日志显示登录名结束:用户未通过身份验证。循环以启动HTTP/1.1 GET的请求开始http://localhost:5555/.well-已知的/openid配置。然后-请求启动HTTP/1.1 GEThttp://localhost:5555/connect/authorize?response_type=code

共有1个答案

羿易安
2023-03-14

也许我反应晚了。以下是我的观察结果。

下面的代码在您的身份验证服务构造函数异步工作,有一个非常好的理由,你不会有用户对象填充的时间检查凭据称为应用程序内组件,也修复了这一点,通过使构造函数是一个反模式,你真的需要有一个异步和等待使用在这里。

 this.userManager.getUser().then(user => {
      this.user = user;
    });
 类似资料:
  • 实时调试模块提供埋点的审计功能,主要应用于以下两个业务场景: 测试或者产品需要校验埋点是否跟业务场景一致: 埋点是否埋上:当前业务流程或者位置是否有埋点。==避免漏埋== 埋点是否准确:当前埋点是否跟业务流程或者位置一致,关键信息是否上报。==避免埋点错误== 测试或者开发需要校验埋点,但是又不希望当前操作产生错误日志污染线上数据 实时调试功能目前支iOS、Android以及微信小程序,本节介绍客

  • 我正在遵循GitHub上的Microsoft Graph repository提供的一个示例。其中,它描述了使用需要访问令牌的DelegateAuthenticationProvider。Marc Lafleur的auth流入门指定了一种获取访问令牌的方法,我结合了使服务-服务身份验证工作的指导。 尽管我收到了一个似乎有效的访问令牌,但当我通过graph客户端发出命令时,我会从Microsoft

  • 客户端模块是一个较复杂的模块,这里包含了集群管理、路由、地址管理器、连接管理器、负载均衡器,还与代理、注册中心等模块交互。

  • 我正在尝试设置一个Android应用程序,该应用程序可以使用Google Drive REST API概述中的指南操作存储在我个人Google Drive帐户上的文件。 我按照示例代码允许用户连接到帐户,但无论是否选择帐户名称或按下取消按钮,“选择帐户”对话框都会不断重新出现。 我认为问题在于,在测试mCredential时,refreshResults()方法总是返回null。getSelect

  • 我通过SSL证书使用Axis实现调用Web服务。我使用keytool将证书添加到密钥库中。 它显示为"证书已添加到密钥库"。但是当我运行java程序时,我得到以下异常 故障代码:{http://schemas.xmlsoap.org/soap/envelope/}服务器。userException faultSubcode:faultString:javax。网ssl。SSLHandshakeEx

  • 如何配置Keycloak以使用特定的OIDC-client进行身份验证,但如果用户没有特定的角色,则返回失败的身份验证?