IdentityServer3和Angular4,强制初始登录

时间:2017-11-22 13:36:51

标签: angular oauth identityserver3

我们有一个大型项目,包括用于FE的Angular4应用程序,用于BE的.Net WebApi2 MVC应用程序和一个MVC5应用程序,其中嵌入了用于身份验证服务器的IdentityServer3框架。

我们正在努力实施SSO平台。 Angular项目使用angular-oauth2-oidc包来处理身份验证。

到目前为止,一切运行良好,但我们为强制用户登录而采取的解决方案并不健全。

如果我们过早地调用initImplicitFlow,则没有任何反应。在X时间后调用它将应用程序重定向到IdentityServer3登录页面(如预期的那样)。

我们的身份验证服务看起来像这样:

// Load Discovery Document and then try to login the user
this.oauthService.loadDiscoveryDocument().then(() => {
    this.initialiseUser();
});

private initialiseUser(): void {
  // This method just tries to parse the token(s) within the url when
  // the auth-server redirects the user back to the web-app
  // It dosn't send the user the the login page
  this.oauthService.tryLogin({
    onTokenReceived: context => {
      const claims: any = this.oauthService.getIdentityClaims();
      if (claims) {
        if (!this.currentUser) {
            this.currentUser = new AppUser();
        }
        this.currentUser.sub = claims.sub.trim();
        this.currentUser.given_name = claims.given_name.trim();
        this.currentUser.id_token = this.oauthService.getIdToken();
        this.loggedIn = true;
        this.router.navigate(['/home/dashboard']);
      }
    },
  });
  this.onAuthServiceReady.emit(true);
}

我们的路由器模块如下所示:

export class CoreRoutingModule {

  loginTried = false;

  constructor(public router: Router, public authService: AppAuthService, public http: Http) {
    this.authService.onAuthServiceReady.subscribe(() => {
      this.loginTried = true;
    });

    router.events.forEach((e) => {
      if (e instanceof NavigationStart) {
        let loginSpinner = setInterval(() => {
          if (!authService.currentUser && this.loginTried) {
            this.authService.login();
          }

          if (authService.currentUser) {
            clearInterval(loginSpinner);
          }
        }, 5000);
      }
    });

  }
}

setInterval每秒运行4次,直到我们尝试了一个发生无限循环的非常慢的设备。我把它改为5秒,但是,我觉得这不是一个好的解决方案。

我能想到的一个解决方案是允许带有图像和大登录按钮的匿名主页,但是,首先要强制重定向到IdentityServer。有没有更好的方法来实现这一目标?

提前致谢!

0 个答案:

没有答案