Мое приложение состоит из двух отдельных проектов: .NET core back-end и Angular front-end.
Я успешно добавил Windows ADаутентификации и я получаю информацию о пользователе внутри моего приложения Angular, но только после обновления страницы.
При первом открытии страницы мой пользователь имеет значение null
ERROR TypeError: Cannot read property 'name' of null
После обновления я могуполучить информацию о пользователе. Что на самом деле происходит и как мне исправить эту проблему?
public Task < AdUser > GetAdUser(Guid guid) {
return Task.Run(() => {
try {
PrincipalContext context = new PrincipalContext(ContextType.Domain);
UserPrincipal principal = new UserPrincipal(context);
if (context != null) {
principal = UserPrincipal.FindByIdentity(context, IdentityType.Guid,
guid.ToString());
}
return AdUser.CastToAdUser(principal);
} catch (Exception ex) {
throw new Exception("Error retrieving AD User", ex);
}
});
}
identity.service.ts
getCurrentUser() {
return this.http.get(this.apiUrl + '/identity/GetAdUser', { withCredentials: true });
}
app.component.rs
this.identityService.getCurrentUser()
.subscribe(res => {
localStorage.setItem('user', JSON.stringify(res));
});
top-navigation.component.ts
user = JSON.parse(localStorage.getItem('user'));
Наконец, я получаю пользовательские данные внутри моего топ-навигационного компонента, потому что мне нужно, чтобы имя и фамилия отображались внутри него.
РЕДАКТИРОВАТЬ: добавлен новый код
app-routing.module.ts
const appRoutes: Routes = [
{
path: 'home',
component: HomeComponent,
data: { title: 'Home' },
canActivate: [AuthGuardService]
},
{
path: 'history',
component: HistoryComponent,
data: { title: 'History' }
},
{
path: '404',
component: NotFoundErrorComponent,
data: { title: 'Error 404' }
},
{
path: '',
component: HomeComponent,
pathMatch: 'full'
},
{
path: '**',
redirectTo: '/404',
pathMatch: 'full',
data: { title: 'Error 404' }
}
];
@NgModule({
imports: [RouterModule.forRoot(appRoutes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
app.component.ts
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'Home';
constructor(private titleService: Title,
private router: Router,
private activatedRoute: ActivatedRoute { }
ngOnInit() {
this.router.events.pipe(
filter(event => event instanceof NavigationEnd),
map(() => this.activatedRoute),
map((route) => {
while (route.firstChild) { route = route.firstChild; }
return route;
}),
filter((route) => route.outlet === 'primary'),
mergeMap((route) => route.data))
.subscribe((event) => this.titleService.setTitle(event.title));
}
}
top-navigation.component.ts
export class TopNavigationComponent implements OnInit {
constructor(private router: Router) { }
user;
ngOnInit() {
this.user = JSON.parse(localStorage.getItem('user'));
}
}
РЕДАКТИРОВАТЬ: окончательное решение
app-routing.module.ts
const appRoutes: Routes = [
{
path: '',
component: TopNavComponent,
resolve: { userData: IdentityResolverService },
children: [
{
path: 'home',
component: HomeComponent,
data: { title: 'Home' },
canActivate: [AuthGuardService]
},
{
path: 'history',
component: HistoryComponent,
data: { title: 'History' },
canActivate: [AuthGuardService]
},
{
path: '404',
component: NotFoundErrorComponent,
data: { title: 'Error 404' },
canActivate: [AuthGuardService]
},
{
path: '',
redirectTo: 'home',
pathMatch: 'full',
canActivate: [AuthGuardService]
},
{
path: '**',
redirectTo: '/404',
pathMatch: 'full',
data: { title: 'Error 404' },
canActivate: [AuthGuardService]
}
]
};
]