Caricamento collettivo dell'utente tramite file JSON in Active Directory di Azure B2C in Java

Aug 24 2020

Ho collegato il mio codice java ad Active Directory di Azure B2C e l'ho usato

User user = graphClient.users("611us0f2a-7608-4edd-8c4c-7871d8e70b8e").buildRequest().get();

Ho ottenuto il risultato nella richiesta get () che significa che la mia connessione è corretta, ora voglio caricare in blocco gli utenti esistenti nel mio database locale, ho creato un file in formato JSON che (user_data.json), assomiglia a questo -

{
  "users": [
    {
      "displayName": "Amanda Polly",
      "givenName": "Amanda",
      "surname": "Polly",
      "extension_user_type": "user",
      "identities": [
        {
          "signInType": "emailAddress",
          "issuerAssignedId": "[email protected]"
        }
      ],
      "extension_timezone": "PST",
      "extension_locale": "en-US",
      "extension_tenant": "EG1234"
    },
    {
      "displayName": "Lowa Doe",
      "givenName": "Lowa",
      "surname": "Doe",
      "extension_user_type": "user",
      "identities": [
        {
          "signInType": "userName",
          "issuerAssignedId": "lowadow123"
        }
      ],
      "extension_timezone": "PST",
      "extension_locale": "en-US",
      "extension_tenant": "EG1234"
    }
   ]
}

Qui in JSON ho un wrapper "users" e poi seguito da tutti gli utenti (2 utenti al momento se vedete in JSON), quindi ora devo crearli usando mircosoft graph api, come procedo? quello che so, devo convertire ogni utente in un oggetto e utilizzare post () da inviare per crearli nella directory.

Si prega di suggerire una soluzione su come farlo.

|| Per farti leggere Allen, come hai suggerito, quando il codice sarà disponibile,

private static void updateExtension(String userID, IGraphServiceClient graphClient) 
    {
        User extensionForUser = new User();
        extensionForUser.additionalDataManager().put("extension_dfa4f1a9a2f94cd1bf8826c50d4d0464_user_type", new JsonPrimitive(extension_user_type));
        extensionForUser.additionalDataManager().put("extension_dfa4f1a9a2f94cd1bf8826c50d4d0464_timezone", new JsonPrimitive(extension_timezone));
        extensionForUser.additionalDataManager().put("extension_dfa4f1a9a2f94cd1bf8826c50d4d0464_extension_locale", new JsonPrimitive(extension_locale));
        extensionForUser.additionalDataManager().put("extension_dfa4f1a9a2f94cd1bf8826c50d4d0464_tenant", new JsonPrimitive(extension_tenant));
        graphClient.users(userID)
                .buildRequest()
                .patch(extensionForUser);
        
    }

Si sta interrompendo in .patch (extensionForUser) -> con un errore come

Error message: Resource 'null' does not exist or one of its queried reference-property objects are not present.

PATCH https://graph.microsoft.com/v1.0/users/null
SdkVersion : graph-java/v1.9.0
Authorization : Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI[...]
{"extension_dfa4f1a9a2f94cd1bf8826c50d4d0464_tenan[...]

404 : Not Found
[...]

Ma quando ho controllato la mia directory di Azure, l'utente è stato creato. Perché quando ho eseguito il codice, ho detto che esiste già un utente con lo stesso nome principale.

Inoltre, poiché si sta interrompendo nella prima iterazione, gli utenti che devono essere creati dietro questo non vengono creati.

Aggiornamento 2:

Aggiornamento 3: spiegazione di ciò che ho provato.

userID = userCreateCall(displayName, givenName, surname, extension_user_type, extension_timezone, extension_locale, extension_tenant, signInType, issuerAssignedId, graphClient);
                System.out.println(userID);
                updateExtension(userID, graphClient, extension_user_type, extension_timezone, extension_locale, extension_tenant);

Se vedi che ho un ciclo for che itererà attraverso ogni utente e in ogni iterazione, selezionerà [displayName, givenName, surname, extension_user_type, extension_timezone, extension_locale, extension_tenant, signInType, issuerAssignedId] per ogni utente e lo passerà come parametro al metodo userCreateCall () come puoi vedere nel codice sopra, sto anche passando graphClient all'interno del parametro.

Questo è il mio metodo userCreateCall () ,

User createNewUser = new User();
        createNewUser.displayName = displayName;
        createNewUser.givenName = givenName;
        createNewUser.surname = surname;
        
        LinkedList<ObjectIdentity> identitiesList = new LinkedList<ObjectIdentity>();
        ObjectIdentity identities = new ObjectIdentity();
        identities.signInType = signInType;
        identities.issuerAssignedId = issuerAssignedId;
        identities.issuer = "demoUserEngine.onmicrosoft.com";
        identitiesList.add(identities);
        
        createNewUser.identities = identitiesList;
        
        PasswordProfile passwordProfile = new PasswordProfile();
        passwordProfile.password = "passwordPASSWORD!";
        passwordProfile.forceChangePasswordNextSignIn = false;
        
        createNewUser.passwordProfile = passwordProfile;
        createNewUser.passwordPolicies = "DisablePasswordExpiration";
        
        User buildUserRequest = graphClient.users()
                                .buildRequest()
                                .post(createNewUser);
        
        
        return createNewUser.id;

Sto restituendo createNewUser.id ma penso che sia NULL qui, quindi

userID = userCreateCall(displayName, givenName, surname, extension_user_type, extension_timezone, extension_locale, extension_tenant, signInType, issuerAssignedId, graphClient);
System.out.println(userID); // THIS IS giving NULL

Quindi, quando si chiama l' updateExtensionID utente di aggiornamento diventa NULL,

Ho commentato il metodo updateExtension in modo da non dover utilizzare l' ID utente e il codice non si interrompe, nessuna eccezione nella creazione dell'utente, solo l'ID utente diventa NULL.

Risposte

1 AllenWu Aug 25 2020 at 13:42

Non è possibile creare l'utente in Azure B2C direttamente con gli attributi dell'estensione.

Dovremmo prima creare l'utente con gli attributi normali e poi aggiornare gli attributi di estensione per l'utente.

Prima di tutto è necessario creare gli attributi di estensione ( extension_user_type, extension_timezone, extension_locale, extension_tenant) in Azure Portal seguendo Creare un attributo personalizzato . Si prega di notare è sufficiente inserire user_type, timezone, locale, tenantcome il nome dell'attributo estensione.

Quindi genererà l'attributo di estensione con il formato:, extension_ApplicationClientID_attributenamedove ApplicationClientID è l'ID dell'applicazione (client) b2c-extensions-appdell'applicazione (che si trova in Registrazioni app > Tutte le applicazioni nel portale di Azure).

Tieni presente che l'ID dell'applicazione (client) come è rappresentato nel nome dell'attributo di estensione non include trattini. Ad esempio, il mio ID applicazione b2c-extensions-appdell'applicazione è a554ad42-83c8-475e-a9aa-ac09a9h25c67. Ma l'attributo di estensione effettivo è extension_a554ad4283c8475ea9aaac09a9h25c67_attributename, che ha rimosso tutti i file -. Vedi riferimento qui .

Ora ci stiamo preparando a creare l'utente. Fare riferimento al mio codice:

public static void main(String[] args) {
        List<String> scopes = Arrays.asList("https://graph.microsoft.com/.default");
        String clientId = "3******9-5a11-4823-88de-13*******cad";
        String clientSecret = "**********************************";
        String tenant = "allentest001.onmicrosoft.com";
        ClientCredentialProvider authProvider = new ClientCredentialProvider(
                clientId,
                scopes,
                clientSecret,
                tenant,
                NationalCloud.Global);

        IGraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();
        String userId = createUser(graphClient);
        updateExtension(userId, graphClient);
    }

    private static String createUser(IGraphServiceClient graphClient) {
        User user = new User();
        user.displayName = "Amanda Polly";
        user.givenName = "Amanda";
        user.surname = "Polly";
        LinkedList<ObjectIdentity> identitiesList = new LinkedList<ObjectIdentity>();
        ObjectIdentity identities = new ObjectIdentity();
        identities.signInType = "emailAddress";
        identities.issuer = "allentest001.onmicrosoft.com";
        identities.issuerAssignedId = "[email protected]";
        identitiesList.add(identities);
        user.identities = identitiesList;
        PasswordProfile passwordProfile = new PasswordProfile();
        passwordProfile.password = "{your password here}";
        passwordProfile.forceChangePasswordNextSignIn = false;
        user.passwordProfile = passwordProfile;
        user.passwordPolicies = "DisablePasswordExpiration";

        User newUser = graphClient.users()
                .buildRequest()
                .post(user);

        return newUser.id;
    }


    private static void updateExtension(String userId, IGraphServiceClient graphClient) {
        User user = new User();
        user.additionalDataManager().put("extension_a554ad4283c8475ea9aaac09a9h25c67_user_type", new JsonPrimitive("user"));
        user.additionalDataManager().put("extension_a554ad4283c8475ea9aaac09a9h25c67_timezone", new JsonPrimitive("PST"));
        user.additionalDataManager().put("extension_a554ad4283c8475ea9aaac09a9h25c67_extension_locale", new JsonPrimitive("PST"));
        user.additionalDataManager().put("extension_a554ad4283c8475ea9aaac09a9h25c67_tenant", new JsonPrimitive("EG1234"));
        graphClient.users(userId)
                .buildRequest()
                .patch(user);
    }

Tieni presente che dovresti impostare una password durante la creazione dell'utente. (vedi dettagli nel mio codice)

krishg Aug 24 2020 at 22:41

Per creare un singolo utente alla volta, è necessario effettuare una chiamata per ciascuno dei tuoi utenti in Java. Fare riferimento al documento API per questo qui . Ma Graph SDK supporta anche il batch. Puoi comporre il tuo payload JSON costituito da singole richieste ed effettuare un singolo POST a $ batch endpoint. Fare riferimento a questo per i dettagli.

NOTA: per le limitazioni correnti con il batch JSON in Microsoft Graph, vedere Problemi noti .