Azure токенов групп: true, Adal angular, Graph API, - PullRequest
1 голос
/ 21 января 2020

Я работаю над приложением Angular и net в бэкэнде. вместо того, чтобы создавать таблицу для пользователей, я использую Microsoft Azure для входа в приложение после его восстановления в Azure. На стороне Angular я использую библиотеку 'microsoft-adal-angular6' для подключения к azure и возврата токена, и все в порядке, для большей безопасности я отправляю этот токен на сервер, к которому он также подключен Azure и проверьте этот токен после того, как будут показаны данные, и пока все здесь в порядке, и я получил токен.

НО этот токен не имеет свойства 'groups' с Id, когда у пользователя более 6 групп вместо него токен имеет свойство hasgroups: true. И у меня есть политики на бэкэнде, например, для добавления нового клиента, и когда пользователь имеет более 6 групп, он не может добавить клиента, и ошибка 403 запрещена. Я много пытался найти душу. но я не нашел правильного в моем случае, что я понимаю, и мне нужно вызвать API графа, чтобы привести все группы, но я не нашел никакого реального примера, просто объяснение. Итак, не могли бы вы сказать мне в этом случае, как я могу сделать, чтобы решить эту проблему. вот код, как я подключаюсь к azure из Angular.

Angular:

appModule.ts:

imports: [ MsAdalAngular6Module.forRoot({
  tenant: 'tetant Id of the app in Azure',
  clientId: 'client Id of the app in Azure',
  redirectUri: window.location.origin,
  endpoints: {
    "http://localhost:4211/": "http://localhost:4211/",
  },
  navigateToLoginRequestUrl: false,
  cacheLocation: '<localStorage / sessionStorage>', }),

Angular Iterceptor выглядит так :

класс экспорта Interceptor реализует HttpInterceptor {

initialToken; headers = new HttpHeaders ({'Content-Type': 'application / json'});

конструктор (приватный adalSv c: MsAdalAngular6Service, приватный http:HttpClient, приватный маршрутизатор: маршрутизатор)

{

this.initialToken = sessionStorage.getItem('adal.idtoken') ;

console.log( "initialToken " , this.initialToken); 

} ​​

Перехват (запрос: HttpRequest, следующий: HttpHandler): Наблюдаемый> {

if (this.initialToken) {

  request = request.clone({
    setHeaders: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${this.initialToken}`
    }
  });

  }

return next.handle( request ).pipe( tap(() => {},
  (err: any) => {
if (err instanceof HttpErrorResponse) {
    if (err.status !== 401) {
     return;
    }
    this.router.navigate(['']);
  }
}))

}

маркер проверки обратной стороны:

services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                sharedOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
                sharedOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

            })


            .AddJwtBearer(options =>
            {
                options.Audience = "clientId";
                options.Authority = "https://login.microsoftonline.com/tetantId/";

                options.RequireHttpsMetadata = false;

                options.Events = new JwtBearerEvents()
                {
                    OnTokenValidated = context =>
                    {
                        return Task.CompletedTask;
                    }
                };
            });

Спасибо за помощь.

1 Ответ

1 голос
/ 21 января 2020

Если вы используете неявный поток и у пользователя есть 6 или более групп, они не будут включены в маркер доступа. Ограничение меньше для неявного потока, поскольку токен возвращается в URL.

В этом случае не рекомендуется использовать утверждение groups. Вы можете определить некоторые роли приложения и назначить роли группам. Тогда у пользователей в группе будет претензия, подобная приведенной ниже:

{
  "roles": ["admin"]
}

Затем вы можете реализовать свой логин авторизации c в зависимости от ролей пользователя. См. Ссылку здесь .

Конечно, вы также можете вызвать Microsoft Graph API для получения информации о группах.

Код должен выглядеть следующим образом:

if (hasGroups)
  Call the Graph to inquire:
    Either about the full group membership OR 
    About membership to a particular group
else
  Access groups directly from the token

См. образец для Angular приложений с Microsoft Graph. Для получения дополнительной информации см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...