【问题标题】:Lack of Session Expiration with Azure Active DirectoryAzure Active Directory 缺少会话过期
【发布时间】:2022-06-15 17:09:26
【问题描述】:
目前,我正在开展一个项目(Angular、Spring Boot),安全团队在该项目中进行了一些渗透测试。
我们在解决有关会话到期的问题时遇到了问题。
具体来说,应用程序不会在给定的空闲时间后使用户的会话无效并且用户保持登录状态。
我们使用 Angular 中的 msal 库对我们的用户进行身份验证,并检索 id 令牌。我可以看到 id 令牌在 1 小时后过期,但似乎 msal 静默重新验证并在过期时获取新令牌。
这个id令牌过期后有没有办法强制重新登录?
【问题讨论】:
标签:
angular
msal
session-timeout
msal.js
【解决方案1】:
在我们的例子中,我们实现了一个 Guard,扩展了提供的 MsalGuard
@Injectable({
providedIn: 'root',
})
export class SessionGuard extends MsalGuard implements CanActivate {
private loginFailedRedirect: UrlTree;
constructor(
@Inject(MSAL_GUARD_CONFIG) msalGuardConfig: MsalGuardConfiguration,
msalBroadcastService: MsalBroadcastService,
authService: MsalService,
location: Location,
router: Router,
) {
super(msalGuardConfig, msalBroadcastService, authService, location, router);
this.loginFailedRedirect = this.parseUrl(msalGuardConfig.loginFailedRoute);
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> {
return super.canActivate(route, state).pipe(
mergeMap((msalGuardCanActivateResult: boolean | UrlTree) => {
const isSignedIn = msalGuardCanActivateResult === true;
if (isSignedIn) {
// Check the expiration of current session
const activeAccount = this.authService.instance.getActiveAccount();
if (activeAccount) {
if (!activeAccount.idTokenClaims['exp'] || new Date().getTime() / 1000 > activeAccount.idTokenClaims['exp']) {
return this.authService.instance.logoutRedirect(`log-out/expired`).pipe(map(() => false));
}
return of(true);
} else {
return of(this.loginFailedRedirect);
}
} else {
return of(msalGuardCanActivateResult);
}
}),
catchError(() => {
return of(this.loginFailedRedirect);
}),
);
}
}