Аутентификация Azure AD перенаправляет меня на «{domain}/.auth/login/done» после «{domain}/.auth/login/aad/callback»?

У меня есть приложение 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, поэтому я подписался на этот пост и добавил платформы «веб» и «одностраничное приложение».

Я видел следующие сообщения, но, похоже, они выполняют некоторую аутентификацию на стороне сервера:

  1. Azure Active Directory всегда перенаправляет на «~/.auth/login/done». при развертывании в Azure, несмотря на работу на локальном хосте
  2. Веб-приложение с Azure Active Directory всегда перенаправляется на URL-адрес ~/.auth/login/done
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я создал простое приложение Angular с помощью Azure AD и успешно развернул его в Службе приложений Azure.

  • Обязательно настройте URL-адрес вашего веб-приложения 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)
});
}
}
  • Убедитесь, что URI перенаправления в разделе «Одностраничное приложение» соответствует URI в вашем коде.

  • Настройте приведенную ниже команду запуска в разделе конфигурации веб-приложения Azure.
pm2 serve /home/site/wwwroot/dist/my-angular-app/browser --no-daemon --spa

Вот результат после развертывания:

Ответ принят как подходящий

Если вы используете MSAL angular, попробуйте отключить встроенную аутентификацию Azure для клиентских приложений в службах приложений.

Другие вопросы по теме