我的应用程序 B 托管在另一个应用程序 A 的 iframe 内。用户旅程是用户登录到父应用程序 A,然后单击导航菜单,将我的应用程序 B 加载到 iframe 中。该应用程序 B 是 Angular SPA,后端托管在不同的域上。在获取带有重定向流的会话后,我尝试在此应用程序 B 中使用承载令牌。我也使用“allowRedirectInIframe”标志。但这不起作用。 B 启动重定向流程返回并重新启动,但失败并出现以下错误
我可以看到一些问题/文档,其中明确指出重定向流在 iframe 中是不可能的。例如 https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/3759 https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/iframe-usage.md
但是“allowRedirectInIframe”标志的存在让我相信这已经过时了。如果我错了,请纠正我。否则你能告诉我我做错了什么吗?我已在下面附加了我的 msal 配置和 app.module.ts 文件。
MSAL 配置
auth: {
clientId: 'xxxxxxxxxxxx',
authority: b2cPolicies.authorities.signUpSignIn.authority,
knownAuthorities: [b2cPolicies.authorityDomain],
redirectUri: https://my.redirect.uri,
postLogoutRedirectUri: '/logged-out'
},
cache: {
cacheLocation: BrowserCacheLocation.LocalStorage,
storeAuthStateInCookie: false
},
system: {
loggerOptions: {
logLevel: LogLevel.Error,
piiLoggingEnabled: false,
},
allowRedirectInIframe: true,
},
相关代码片段
// app.module.ts code
providers: [
ConfigService,
{provide: HTTP_INTERCEPTORS, useClass: RequestHeaderInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: ConfigServiceInterceptor, multi: true, deps: [ConfigService]},
{provide: HTTP_INTERCEPTORS, useClass: RequestErrorInterceptor, multi: true, deps: [ToastrService]},
{provide: ErrorHandler, useClass: AppErrorHandler},
{
provide: HTTP_INTERCEPTORS,
useClass: MsalInterceptor,
multi: true,
},
{
provide: MSAL_INSTANCE,
useFactory: MSALInstanceFactory,
},
{
provide: MSAL_GUARD_CONFIG,
useFactory: MSALGuardConfigFactory,
},
{
provide: MSAL_INTERCEPTOR_CONFIG,
useFactory: MSALInterceptorConfigFactory,
},
MsalService,
MsalGuard,
MsalBroadcastService,
// {
// provide: APP_INITIALIZER,
// multi: true,
// deps: [MsalService],
// useFactory: (authService: MsalService) => {
// return () => {
// return authService.ssoSilent({
// scopes: []
// }).toPromise();
// };
// }
// },
],
bootstrap: [AppComponent]
})
核心库 MSAL.js v2 (@azure/msal-browser)
核心库版本 2.22.0
包装库 MSAL 角度 (@azure/msal-angular)
包装库版本 2.1.1
身份提供商:Azure B2C 自定义策略 来源:外部(客户)
是的,iframe 所在的父应用程序有自己的登录名,因此流程在此应用程序中完成登录,并在 iframe 内的应用程序中完成登录。这些应用程序位于不同的服务器中,但它们具有相同的登录名,所以你说我可以在 iframe 内的应用程序中执行 ssoSilent 吗?谢谢! :)