вызов графа Microsoft с помощью авторизованного пользователя - PullRequest
0 голосов
/ 12 апреля 2020

Я создал ASP. Net Веб-приложение (. Net Framework) с работой / Школьная аутентификация через Azure. Когда я запускаю его, он просит пользователей войти в систему, как и ожидалось.

С другой стороны, чтобы позвонить в Microsoft Graph и получить фото, например, GET https://graph.microsoft.com/v1.0/me/photo/$value, мне нужно получить токен доступа. Я знаю, как получить токен доступа, используя имя пользователя и пароль, но система не зафиксировала, какое имя пользователя и пароль уже введены пользователем, поэтому для этого требуется, чтобы система снова попросила пользователя ввести свой пароль, что странно !!

Если я использую отдельное имя пользователя и пароль, я потеряю возможность использования me в параметрах вызова API, так как это станет другим пользователем. Кроме того, я знаю, что могу вызывать Graph, используя идентификатор клиента вместо имени пользователя и пароля, но опять же я не смогу вызывать любой API, используя me параметр

Есть ли способ получить токен доступа с помощью текущий вошедший в систему пользователь, не прося его ввести учетные данные снова? Я не знаю, неправильно ли я использую концепцию, но цель - вызвать Graph API, используя me и не прося пользователя дважды вводить учетные данные, а используя преимущества вошедшего в систему пользователя!

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Итак, для тех, кто создал Asp. Net проект веб-приложения с Azure проверкой подлинности на работе или в школе, и беспокоится о том, как использовать аутентификацию вошедшего в систему пользователя для получения токена доступа. и позвоните в Microsoft Graph, не спрашивая пользователя для повторного ввода его учетных данных, четкий ответ после нескольких поисков:

НЕ ДУМАЙТЕ О СБРОСЕ SH TOKEN.

Да, обычно идея состоит в том, чтобы захватить токен refre sh и использовать его при следующем вызове, чтобы получить новый токен доступа для вызова API. Но Microsoft.IdentityModel.Clients.ActiveDirectory, который используется в этой настройке, делает его более простым. Этот пакет упрощает весь процесс и предоставляет вам два метода для вызова:

AcquireTokenByAuthorizationCodeAsync (StartupAuth.cs): который используется при запуске приложения, чтобы попросить пользователя войти в систему и получить первый токен доступа. , БЕЗ РЕФРЕКА SH TOKEN!

AcquireTokenSilentAsync: дает вам новый токен доступа для того же вошедшего в систему пользователя. Вы, возможно, не замечаете, как я , что новая страница UserInfo.aspx была добавлена ​​в проект во время создания, чтобы показать вам, как получить новый токен доступа для каждого вызова API, который вы делаете. Просто посмотрите на этот код страницы, чтобы понять всю концепцию.

Я надеюсь, что это прояснит путаницу, поскольку обычно пользователи будут думать о коде refre sh вместо этого!

0 голосов
/ 12 апреля 2020

Короче говоря:

Вход в систему вызова: https://login.microsoftonline.com/TENANTID/oauth2/v2.0/authorize возвращает code.

Запросить доступ к областям, среди параметров code: https://login.microsoftonIine.com/TENANTID/oauth2/v2.O/token

Отсюда вы получаете access_token и refresh_token, которые вы используете против https://graph.microsoft.com. access_token можно использовать повторно, а новый можно запросить, отправив в refresh_token, который является долгоживущим.

РЕДАКТИРОВАТЬ: я запускаю это на сервере Blazor, но я надеюсь, что это помогает. В моем _Host.cs html я собираю acess_token и refresh_token.

        var tokens = new InitialApplicationState()
        {
            access_token    = await HttpContext.GetTokenAsync("access_token"),
            refresh_token   = await HttpContext.GetTokenAsync("refresh_token"),
            id_token        = await HttpContext.GetTokenAsync("id_token"),
            token_type      = await HttpContext.GetTokenAsync("token_type"),
            expires_at      = await HttpContext.GetTokenAsync("expires_at")
        };

Я использую access_token в запросах снова График

       public MyGraphService(MyTokenProvider _token)
        {
            token = _token;
        }

        private readonly MyTokenProvider token = null;

        private static GraphServiceClient graphClient = new GraphServiceClient(authenticationProvider: null);

        private List<HeaderOption> requstHeaders()
        {
            return new List<HeaderOption>() { new HeaderOption("Authorization", "Bearer " + token.AccessToken) };
        }

        public async Task<Microsoft.Graph.User> GetMe()
        {   
            User me = await graphClient.Me.Request(requstHeaders()).GetAsync();
            return me;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...