У меня есть приложение angular, развернутое в службах приложений Azure, и я включил в нем встроенную аутентификацию Azure (также известную как Easy Auth). Я могу успешно войти в систему своего провайдера удостоверений (AAD), но после перенаправления на {domain}/.auth/login/aad/callback
меня снова перенаправляют на {domain}/.auth/login/done
. Любая попытка вернуться к базовому URL-адресу просто повторяется (поскольку, по-видимому, любой созданный код или токен не был отправлен обратно в приложение).
/done
конечная точка:
URI перенаправления регистрации приложения:
Захвачен сетевой запрос, показывающий соответствующий URI перенаправления:
Еще немного контекста: эта проблема возникает только в развернутых экземплярах. При локальной сборке внешнего интерфейса для URI перенаправления просто устанавливается значение localhost:4200
(определено на платформе SPA), и все работает как задумано. Однако простое использование {domain}/.auth/login/aad/callback
под платформой «SPA» привело к ошибке PKCE, поэтому я подписался на этот пост и добавил платформы «веб» и «одностраничное приложение».
Я видел следующие сообщения, но, похоже, они выполняют некоторую аутентификацию на стороне сервера:
Я создал простое приложение Angular с помощью Azure AD и успешно развернул его в Службе приложений Azure.
app.module.ts
и auth-config.ts
как redirectUri
перед его развертыванием в Службе приложений Azure.app.module.ts:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouterModule } from '@angular/router';
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
import {
MsalModule,
MsalInterceptor,
MsalService,
MSAL_INSTANCE,
MsalGuard,
MSAL_GUARD_CONFIG,
MSAL_INTERCEPTOR_CONFIG,
MsalGuardConfiguration,
MsalInterceptorConfiguration
} from '@azure/msal-angular';
import { PublicClientApplication, InteractionType } from '@azure/msal-browser';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
export function MSALInstanceFactory() {
return new PublicClientApplication({
auth: {
clientId: '<client-id>',
authority: 'https://login.microsoftonline.com/<tenant-id>',
redirectUri: '<your-azure-web-app>',
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: true,
},
});
}
export function MSALGuardConfigFactory(): MsalGuardConfiguration {
return {
interactionType: InteractionType.Redirect,
authRequest: {
scopes: ['user.read']
}
};
}
export function MSALInterceptorConfigFactory(): MsalInterceptorConfiguration {
return {
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
['https://graph.microsoft.com/v1.0/me', ['user.read']]
])
};
}
@NgModule({
declarations: [
AppComponent,
HomeComponent,
LoginComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: 'translate', component: HomeComponent, canActivate: [MsalGuard] },
{ path: '', component: LoginComponent },
]),
MsalModule.forRoot(
MSALInstanceFactory(),
MSALGuardConfigFactory(),
MSALInterceptorConfigFactory()
)
],
providers: [
MsalService,
MsalGuard,
{
provide: HTTP_INTERCEPTORS,
useClass: MsalInterceptor,
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
аутентификация-config.ts:
import { Configuration, BrowserCacheLocation, LogLevel } from '@azure/msal-browser';
const isBrowser = typeof window !== 'undefined';
export const msalConfig: Configuration = {
auth: {
clientId: '<client-id>',
authority: 'https://login.microsoftonline.com/<tenant-id>',
redirectUri: '<your-azure-web-app>',
},
cache: {
cacheLocation: BrowserCacheLocation.LocalStorage,
storeAuthStateInCookie: isBrowser && isIE(),
},
system: {
loggerOptions: {
loggerCallback(logLevel, message, containsPii) {
if (containsPii) {
return;
}
switch (logLevel) {
case LogLevel.Error:
console.error(message);
return;
case LogLevel.Info:
console.info(message);
return;
case LogLevel.Verbose:
console.debug(message);
return;
case LogLevel.Warning:
console.warn(message);
return;
}
},
piiLoggingEnabled: false,
}
}
};
export const loginRequest = {
scopes: ["User.Read"]
};
function isIE(): boolean {
return isBrowser && (window.navigator.userAgent.indexOf("MSIE ") > -1 ||
window.navigator.userAgent.indexOf("Trident/") > -1);
}
приложение.компонент.ц:
import { Component, OnInit } from '@angular/core';
import { MsalService } from '@azure/msal-angular';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
})
export class AppComponent implements OnInit {
title(title: any) {
throw new Error('Method not implemented.');
}
constructor(private authService: MsalService, private router: Router) {}
ngOnInit() {
this.authService.handleRedirectObservable().subscribe({
next: (result) => {
if (result != null && result.account != null) {
this.authService.instance.setActiveAccount(result.account);
this.router.navigate(['/translate']);
}
},
error: (error) => console.info(error)
});
}
}
pm2 serve /home/site/wwwroot/dist/my-angular-app/browser --no-daemon --spa
Вот результат после развертывания:
Если вы используете MSAL angular, попробуйте отключить встроенную аутентификацию Azure для клиентских приложений в службах приложений.