Benutzer mit Massen-Upload mithilfe einer JSON-Datei in das Azure B2C-Active Directory in Java
Ich habe meinen Java-Code mit dem Azure B2C-Active Directory verbunden und verwendet
User user = graphClient.users("611us0f2a-7608-4edd-8c4c-7871d8e70b8e").buildRequest().get();
Ich habe das Ergebnis in der Anfrage get () erhalten, was bedeutet, dass meine Verbindung korrekt ist. Jetzt möchte ich Benutzer, die in meiner lokalen Datenbank vorhanden sind, per Bulk-Upload hochladen. Ich habe eine Datei im JSON-Format erstellt, die (user_data.json) so aussieht.
{
"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"
}
]
}
Hier in JSON habe ich einen Wrapper "Benutzer" und dann alle Benutzer (2 Benutzer ab sofort, wenn Sie in JSON sehen). Jetzt muss ich sie mit mircosoft graph api erstellen. Wie gehe ich vor? Was ich weiß, muss ich jeden Benutzer in ein Objekt verwandeln und post () verwenden, um sie im Verzeichnis zu erstellen.
Bitte schlagen Sie eine Lösung vor.
|| Damit Sie Allen lesen können, wie Sie vorgeschlagen haben, wenn der Code kommt,
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);
}
Es bricht bei .patch (extensionForUser) -> mit Fehler wie
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
[...]
Als ich jedoch mein Azure-Verzeichnis überprüfte, wurde der Benutzer erstellt. Denn als ich den Code erneut ausführte, hieß es, dass bereits ein Benutzer mit demselben Hauptnamen existiert.
Da die erste Iteration unterbrochen wird, werden Benutzer, die dahinter erstellt werden sollen, nicht erstellt.
Update 2:
Update 3: Erklärung zu dem, was ich versucht habe.
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);
Wenn Sie sehen, dass ich eine for-Schleife habe, die jeden Benutzer und in jeder Iteration durchläuft, wählt sie für jeden Benutzer [displayName, GivenName, Nachname, extension_user_type, extension_timezone, extension_locale, extension_tenant, signInType, issuerAssignedId] aus und übergibt sie als Parameter An die userCreateCall () -Methode, wie Sie im obigen Code sehen können, übergebe ich auch graphClient innerhalb des Parameters.
Dies ist meine userCreateCall () -Methode.
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;
Ich gebe createNewUser.id zurück, aber ich denke, dass es hier NULL wird, daher
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
Wenn also update updateExtensionuserID als NULL aufgerufen wird,
Ich habe die updateExtension-Methode kommentiert, damit ich keine Benutzer- ID verwenden muss und der Code nicht unterbrochen wurde , keine Ausnahme bei der Benutzererstellung, nur die Benutzer-ID wird NULL.
Antworten
Sie können den Benutzer in Azure B2C nicht direkt mit Ihren Erweiterungsattributen erstellen.
Wir sollten den Benutzer zuerst mit den normalen Attributen erstellen und dann die Erweiterungsattribute für den Benutzer aktualisieren.
Zunächst einmal müssen Sie die Erweiterung Attribute erstellen ( extension_user_type, extension_timezone, extension_locale, extension_tenant) in Azure Portal , indem Sie ein benutzerdefiniertes Attribut erstellen . Bitte beachten Sie nur eingeben user_type, timezone, locale, tenantwie der Name des Erweiterungsattribut.
Anschließend wird das Erweiterungsattribut mit dem Format: generiert extension_ApplicationClientID_attributename, wobei die ApplicationClientID die Anwendungs- (Client-) ID der b2c-extensions-appAnwendung ist (unter App-Registrierungen > Alle Anwendungen im Azure-Portal).
Beachten Sie, dass die Anwendungs- (Client-) ID, wie sie im Namen des Erweiterungsattributs dargestellt wird, keine Bindestriche enthält. Zum Beispiel ist meine Anwendungs-ID der b2c-extensions-appAnwendung a554ad42-83c8-475e-a9aa-ac09a9h25c67. Aber das eigentliche Erweiterungsattribut ist extension_a554ad4283c8475ea9aaac09a9h25c67_attributename, das alle entfernt hat -. Siehe Referenz hier .
Jetzt bereiten wir uns darauf vor, den Benutzer zu erstellen. Bitte beziehen Sie sich auf meinen Code:
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);
}
Bitte beachten Sie, dass Sie beim Erstellen des Benutzers ein Passwort festlegen sollten. (siehe Details in meinem Code)
Um jeweils einen einzelnen Benutzer zu erstellen, müssen Sie für jeden Ihrer Benutzer in Java einen Anruf tätigen. Bitte beachten Sie die API doc für das hier . Das Graph SDK unterstützt jedoch auch das Batching. Sie können Ihre JSON-Nutzdaten aus einzelnen Anforderungen zusammenstellen und einen einzelnen POST für den $ Batch-Endpunkt erstellen. Bitte beachten Sie dies für Details.
ANMERKUNG: Aktuelle Einschränkungen beim JSON-Batching in Microsoft Graph finden Sie unter Bekannte Probleme .