我们有一个大型项目,包括用于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。有没有更好的方法来实现这一目标?
提前致谢!