Невозможно получить доступ к API Graph при использовании Azure AD B2C - PullRequest
1 голос
/ 05 июля 2019

У меня есть тестовый идентификатор пользователя test@gollahalliauth.onmicrosoft.com (без глобальных прав администратора), и я пытаюсь получить доступ к Graph API для Azure AD.

Попробуйте 1 (успех)

Я использовал Azure AD Graph Explorer , вошел в систему с test@gollahalliauth.onmicrosoft.com и использовал API https://graph.windows.net/gollahalliauth.onmicrosoft.com/users/test@gollahalliauth.onmicrosoft.com для получения содержимого. Я смог сделать это без каких-либо проблем.

Попробуйте 2 (Fail)

Я написал программу Go с политикой редактирования профиля

import (
    "crypto/rand"
    "encoding/base64"
    "fmt"
    "golang.org/x/oauth2"
    "os"
)

const AuthDomainName string = "https://gollahalliauth.b2clogin.com/gollahalliauth.onmicrosoft.com/oauth2/v2.0"
func main() {
    conf := &oauth2.Config{
        ClientID:     os.Getenv("clientID"),
        ClientSecret: os.Getenv("clientSecret"),
        RedirectURL:  "http://localhost:8080/callback",
        Scopes:       append([]string{"openid", "profile"}),
        Endpoint: oauth2.Endpoint{
            AuthURL:  AuthDomainName + "/authorize?p=b2c_1_gollahalli_edit",
            TokenURL: AuthDomainName + "/token?p=b2c_1_gollahalli_edit",
        },
    }

    // Generate random state
    b := make([]byte, 32)
    rand.Read(b)
    state := base64.StdEncoding.EncodeToString(b)

    parms := oauth2.SetAuthURLParam("response_type", "id_token")

    url := conf.AuthCodeURL(state, parms)

    fmt.Println("AUth URL:",url)
}

Это создает аутентификационный URL для получения токена. Я использовал id_token для доступа к API графа, используя Authorization: Barer id_token, и я получаю ошибку как

{
    "odata.error": {
        "code": "Authentication_ExpiredToken",
        "message": {
            "lang": "en",
            "value": "Your access token has expired. Please renew it before submitting the request."
        }
    }
}

Попробуйте 3 (Fail)

Я попытался добавить User.Read в Azure AD B2C > Applications > <application name> > Published scopes и использовал полный URL-адрес области, и теперь я получаю ошибку как Error: AADB2C90205: This application does not have sufficient permissions against this web resource to perform the operation.

Я не уверен, в чем здесь проблема. Есть идеи, как это преодолеть?

1 Ответ

0 голосов
/ 22 июля 2019

AAD B2C является специализированным экземпляром AAD. Вы можете считать его арендатором AAD с некоторыми расширениями B2C. Примечание: это отдельный клиент от основного клиента AAD вашей организации, в котором вы уже создали каталог / функцию B2C!

Вы можете получить доступ к записям B2C через API AAD Graph, в 2 этапа:

  1. получить токен Графа AAD, предоставив ClientID и ClientSecret конечной точке AAD (например, https://login.microsoftonline.com/yourtenant.onmicrosoft.com).
  2. подключиться к конечной точке REST AAD Graph (например, https://graph.windows.net/yourtenant.onmicrosoft.com/users?api-version=1.6) с помощью требуемого метода (GET / POST / PATCH / DELETE), передав ему токен, полученный на шаге 1, в заголовке Authentication запроса.

Лучшим примером, вероятно, является инструмент миграции пользователей, предоставляемый MS. Конфигурация AAD B2C описана здесь , а образец кода можно загрузить со страницы документации 1018 * или непосредственно из проекта Github .

Вам следует взглянуть на метод SendGraphPostRequest и его друзей в B2CGraphClient.cs. Код использует ADAL для получения токена AAD Graph, но вы также можете получить его напрямую с помощью запросов REST. Упрощенная версия на C # (вам придется самостоятельно перевести ее на GO и, возможно, заменить ADAL, если она недоступна в GO):

            // NOTE: This client uses ADAL v2, not ADAL v4
            AuthenticationResult result = aadAuthContext.AcquireToken(Globals.aadGraphResourceId, aadCredential);
            HttpClient http = new HttpClient();
            string url = Globals.aadGraphEndpoint + tenant + api + "?" + Globals.aadGraphVersion;

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
            request.Content = new StringContent(json, Encoding.UTF8, "application/json");
            HttpResponseMessage response = await http.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {
                string error = await response.Content.ReadAsStringAsync();
                object formatted = JsonConvert.DeserializeObject(error);
                throw new WebException("Error Calling the Graph API: \n" + JsonConvert.SerializeObject(formatted, Formatting.Indented));
            }
...