Caricamento collettivo dell'utente tramite file JSON in Active Directory di Azure B2C in Java
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' updateExtension
ID 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
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
, tenant
come il nome dell'attributo estensione.
Quindi genererà l'attributo di estensione con il formato:, extension_ApplicationClientID_attributename
dove ApplicationClientID è l'ID dell'applicazione (client) b2c-extensions-app
dell'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-app
dell'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)
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 .