使用ASP.NET Web Api 2在angular4中使用guard的解析器

时间:2017-10-23 16:55:29

标签: angular angular2-routing angular-guards

我正在使用Asp.NET Web API 2处理angular 4项目。我想在进入管理部分之前检查用户是否已获得授权。 我尝试在角度路由中设置解析器,如:

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    return this.profile.getProfile()
             .map(result => { setAuthorized(); return result;})
             .catch(res => { return Observable.of(new Profile()); });
 }

setAuthorized()函数将在全局变量中设置授权,因此可以使用函数isAuthorized()进行检查 和授权警卫:

if (this.route.firstChild != null) {
   return this.route.firstChild.data.map( res => {
     if (isAuthorized()) {
       return true;
     }
   });
 } else {
   return Observable.of(false);
 }

路由是:

const routes: Routes =
  [
     {path: ':lang', component: LanguageComponent, 
        children: [
           { path: 'dashboard', component: DashboardComponent, resolve: { authority: AuthorityResolverService} },
           { path: 'admin', component: AdminComponent, canActivate: [AuthorizedGuard], resolve: { authority: AuthorityResolverService}},
        ]}
  ];

一切似乎都正常。但问题是当我单击F5或复制URL并在新窗口中打开它时,我将始终重定向到错误页面。当我监控工作流程时,它显示当我尝试直接访问URL时它没有调用解析器:

  

本地主机/管理

我没有收到任何错误,但我总是被重定向。 任何想法?

1 个答案:

答案 0 :(得分:3)

预期的行为。当您点击路线时,将首先运行警卫,如果canActivate返回true,则将运行解析器。由于您的guard将返回false,因此您的解析器不会被调用(并且不应该被调用)。

这意味着您可能需要重新设计一下您的逻辑,以便将配置文件/授权置于保护状态,因为它实际上是什么保护:它应该检查某些条件并根据它来解决。您的条件是用户已通过身份验证,因此属于后卫。

解析器的目的是在允许用户激活组件后获取组件所需的数据。