Angular 来自角度路由保护的Web Api调用

Angular 来自角度路由保护的Web Api调用,angular,rxjs,Angular,Rxjs,有谁能帮我解释一下,为什么在调用返回结果后,Angular guard内部的异步调用不会激活路由?我尝试了几种方法,利用承诺和观察,但运气有限。我还特别发现了albakov的建议。注意下面的代码片段对我来说很重要。我在控制台中看到了控制台消息,其中包含了我在服务器端api调用中能够破解的所有正确值。结果被传递到canActivate guard返回的可观察路径中,但路径未按预期激活 具有调用api并将_isauthorizedsubject与结果绑定的属性的服务方法: private _isAu

有谁能帮我解释一下,为什么在调用返回结果后,Angular guard内部的异步调用不会激活路由?我尝试了几种方法,利用承诺和观察,但运气有限。我还特别发现了albakov的建议。注意下面的代码片段对我来说很重要。我在控制台中看到了控制台消息,其中包含了我在服务器端api调用中能够破解的所有正确值。结果被传递到canActivate guard返回的可观察路径中,但路径未按预期激活

具有调用api并将_isauthorizedsubject与结果绑定的属性的服务方法:

private _isAuthorized: ReplaySubject<boolean> = new ReplaySubject(1);
get isAuthorized() { return this._isAuthorized.asObservable(); }

checkAuthority(id: number) {
    return this._http.get(this._apiUrl).toPromise().then((response) => {
        console.log(response + ' I resolved!');
        if (response.status === 200)
            this._isAuthorized.next(true);
    });
没有任何类型的控制台错误发生,页面只是在可观察的布尔值解析为true后从不路由

更新 如果我将从登录组件到受保护(受保护)路由的重定向更改为硬重定向(即:window.location.href),而不是
router.navigate
调用,则上述代码可以工作。如果没有登录组件的硬重定向,路由器将在api调用解析后取消对受保护路由的导航(如果启用跟踪)。


只需将可观察(
可观察
)返回到guard中,它就会工作

您是对的,它应该以这种方式工作,但由于某些原因,OIDC的附加组件会重新定向回路由,该路由会将您重新发送到被阻止的页面(未经授权时),从而导致路由器取消导航。如上所述,如果您发出硬刷新,它可以正常工作,因为它在获得授权后不会通过登录url。您是正确的,我使用的OAuth/OIDC库似乎存在问题。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any {
  let id: number = this.getId();

  if (!this._oauthService.hasValidIdToken()) {
    this._router.navigate([`/login/${id}`]);
    return Observable.of(false);
  }

  this._myService.checkAuthority(id);
  return this._myService.isAuthorized.first();
}