当前位置: 首页 > 知识库问答 >
问题:

与哈希位置策略一起使用时,使用ng2 adal库的Angular4 azure active directory身份验证失败

毛正浩
2023-03-14

Angular4 azure active directory身份验证使用ng2 adal库从url中删除id_令牌。

我引用了下面的博客来实现。https://dotronald.be/add-azure-active-directory-to-an-existing-angular-2-single-page-application/

>

  • 已安装ng4 adal

    为ng4-adal创建了一个类型脚本配置文件,以设置Azure连接详细信息,如下所示,从'@角/核'导入{注入式};

            @Injectable()
           export class AdalConfig {
                  public get getAdalConfig(): any {
                  return {
                      tenant: 'YOUR TENANT NAME',
                      clientId: 'YOUR CLIENT ID',           
                      redirectUri: window.location.origin + '/',
                       postLogoutRedirectUri: window.location.origin + 
                      '/logout'
                };
                }
             }
    

    创建了一个canActivate防护,用于在导航前验证角度路线,如下所示,

             import { Injectable } from '@angular/core';
             import { Router, CanActivate,   
             ActivatedRouteSnapshot,RouterStateSnapshot, NavigationExtras } 
             from '@angular/router';
             import {AdalService} from "ng4-adal/core";
    
             @Injectable()
             export class AuthenticationGuard implements CanActivate {
    
             constructor(private _adalService: AdalService, private router: 
             Router) { }
    
             canActivate(route: ActivatedRouteSnapshot, state: 
             RouterStateSnapshot): boolean{
    
                if (this._adalService.userInfo.isAuthenticated) {
                    return true;
                }
                else {
                        this._adalService.login();
                        return false;
                }   }  }
    

    在应用程序的构造函数中添加了以下代码。组成部分ts将启动ng4 adal服务,如下所示:,

                constructor(
                     private _adalService: AdalService,
                     private _adalConfigService: AdalConfig
               )                 
         {this._adalService.init(this._adalConfigService.getAdalConfig);}
    

    为了防止用户每次必须再次登录,身份验证令牌存储在浏览器缓存中。这允许我们尝试检索此令牌并继续使用应用程序,而无需再次重定向到Azure登录页面。

    在应用程序的ngOninit中添加了以下代码。组成部分ts将克服上述问题,具体如下:,

                  ngOnInit() {
                     this._adalService.handleWindowCallback();
                     this._adalService.getUser();
                  }
    

    在步骤3中为app-routing.ts文件中的必需路由创建的防护设置如下,

            const routes: Routes = [
            { path: '', redirectTo: '/home', pathMatch: 'full', canActivate: 
             [AuthenticationGuard]},
             { path: 'admin-measure', redirectTo: '/#admin-measure'},
             { path: 'home', component: HomeComponent, canActivate: 
               [AuthenticationGuard] },                 
             { path: 'logout', component: LogoutComponent },
             { path: 'unauthorized', component: UnauthorizedComponent }
           ];
    

    在应用程序中注册服务。单元

    我在控制台中遇到的错误如下,错误:Uncaught(在promise中):错误:无法匹配任何路由。URL段:“id\u令牌”

    研究发现的问题:在角2中使用哈希时,重定向存在问题。问题是,当身份验证后的重定向中返回AuthResult时,Angular认为这是一个称为access_token的路由。

    有什么解决办法吗?

  • 共有1个答案

    叶书
    2023-03-14

    我找到了解决办法。

    来自服务提供商的回调正在使用Angular2路由器无法理解的#/id_令牌。将在控制台中获取错误-“错误:无法匹配任何路由。Url段:'id_token'”。为了解决这个问题,我们将添加一个回调路由来消化JWT令牌,然后重定向到我们的目标页面。

    A.创建oauth-callback.component如下,

            import { Component, OnInit } from '@angular/core';
            import { Router } from '@angular/router';
            import {AdalService} from "ng4-adal/core";
    
            @Component({
                    template: '<div>Please wait...</div>'
            })
    
            export class OAuthCallbackComponent implements OnInit {
    
            constructor(private router: Router, private _adalService: 
            AdalService) {}
    
            ngOnInit() {
                    if (!this._adalService.userInfo) {
                        this._adalService.login();
                    } else {
                        this.router.navigate(['home']);
                   }
                  }
            }
    

    B.为"id_token"路线创建oauth-callback-handler.guard如下,

            import { Injectable } from '@angular/core';
            import { Router, CanActivate, ActivatedRouteSnapshot, 
            RouterStateSnapshot } from '@angular/router';
            import { AdalService } from 'ng4-adal/core';
    
            @Injectable()
            export class OAuthCallbackHandlerGuard implements CanActivate {
    
            constructor(private router: Router, private _adalService: 
            AdalService) { }
    
            canActivate(route: ActivatedRouteSnapshot, state: 
            RouterStateSnapshot): boolean {
    
                this._adalService.handleWindowCallback();
    
                if (this._adalService.userInfo.isAuthenticated) {
    
                    var returnUrl = route.queryParams['returnUrl'];
                    if (!returnUrl) {
                        this.router.navigate(['home']);
                    } else {
                        this.router.navigate([returnUrl], { queryParams: 
                        route.queryParams });
                    }
                }
                else {
                        this._adalService.login();
                }
    
                return false;
                }
             }
    

    C.注册oauth-callback.componentoauth-callback-handler.guardapp.module.

    d、 为oauth回调处理的“id_令牌”注册路由。组件和oauth回调处理程序。守卫如下:,

              const routes: Routes = [
             { path: 'id_token', component: OAuthCallbackComponent, canActivate: 
               [OAuthCallbackHandlerGuard] }[AuthenticationGuard]},              
             { path: 'logout', component: LogoutComponent }];       
    

    如需进一步参考,请参阅以下链接,

    https://blogs.msdn.microsoft.com/premier_developer/2017/04/26/using-adal-with-angular2/

     类似资料:
    • 我正在尝试使用Shiro对我正在构建的JSF Web应用程序进行身份验证和授权。不幸的是,我仍然有一些困难缠绕我的头如何把所有的东西放在一起。 我已经成功地(100%使用shiro.ini文件)将身份验证配置回存储测试凭据集的JDBC领域。当凭据以明文形式存储时,它对我来说非常有效。 我的最终目标是统一MySQL数据库中的现有凭证集。密码存储为SHA-256盐哈希。我花了一整天的时间阅读可用的文档

    • 我有一个客户端anger-js应用程序。我有一个服务器端nodejs应用程序接口。客户端和服务器端应用程序位于不同的域上。客户端使用API获取或发布一些数据。客户端还需要从服务器端获取图像并在浏览器中显示它们。 我使用护照nodejs模块进行身份验证。我不知道哪种身份验证策略更适合我。我认为有两种类型的身份验证策略:基于令牌的和基于cookie的。我认为这两种类型在我的情况下都没用: > < li

    • 在身份验证等情况下,与会话相比,使用JWTs有什么优势? 它是作为独立方法使用还是在会话中使用?

    • 我使用的是在远程服务器上的脚本上运行curl的本地php脚本。远程脚本受http身份验证保护。 当我运行本地脚本时,我收到以下错误: “此服务器无法验证您是否有权访问URL”/script.php”。您提供了错误的凭据(例如,密码错误),或者您的浏览器不知道如何提供所需的凭据。 如果您被允许请求文档,请检查您的用户ID和密码,然后重试。 如果您认为这是服务器错误,请联系网站管理员。 错误401“

    • 在浏览器中直接键入下面的url,它可以工作, 但是,当我使用相同的url,用于selenium网络驱动程序测试时,它连接到 以及请求HTTP身份验证。我是否需要更改chrome浏览器中的任何设置,或调整默认配置文件?

    • 我正在使用SpringBoot开发具有微服务架构的Rest Backend。为了保护endpoint,我使用了JWT令牌机制。我正在使用Zuul API网关。 如果请求需要权限(来自JWT的角色),它将被转发到正确的微服务。Zuul api网关的“WebSecurityConfigrerAdapter”如下。 这样,我必须在这个类中编写每个请求授权部分。因此,我希望使用方法级安全性,即“Enabl