2
votes

Comment créer un utilisateur avec des propriétés personnalisées dans AAD B2C à l'aide de l'API Graph

Dans mon locataire B2C, j'ai 4 attributs utilisateur personnalisés définis. À l'aide de l'application CLI définie ici: https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet#create-consumer-user -comptes Lorsque j'ajoute mes propriétés personnalisées au .json pour la création d'utilisateurs, telles que

Error Calling the Graph API:
{
  "odata.error": {
    "code": "Request_BadRequest",
    "message": {
      "lang": "en",
      "value": "One or more property values specified are invalid."
    },
    "date": "2019-01-09T16:07:16",
    "requestId": "a1e30ffb-c675-4def-9741-d2a6aceb96c7",
    "values": null
  }
}

j'obtiens l'erreur:

{
  "accountEnabled": true,
  "signInNames": [
    {
      "type": "emailAddress",
      "value": "mail@example.com"
    }
  ],
  "creationType": "LocalAccount",
  "displayName": "Joe Consumer",
  "passwordProfile": {
    "password": "P@ssword!",
    "forceChangePasswordNextLogin": false
  },
  "passwordPolicies": "DisablePasswordExpiration",
  "canViewSoccer": true
}

Que dois-je à faire pour pouvoir utiliser mes propriétés personnalisées dans la création d'utilisateur


1 commentaires

3 Réponses :


2
votes

Un attribut personnalisé doit être formaté comme suit:

"extension_ {app_id} _ {property_name}": "{property_value}"

Exemple:

"extension_917ef9adff534c858b0a683b6e6ec0f3_CanViewSoccer": vrai

{app_id} doit être défini sur l'ID d'application de l ' b2c-extensions-app application qui est enregistrée dans votre locataire Azure AD B2C.


9 commentaires

Lorsque j'effectue des requêtes sur l'utilisateur, les propriétés de l'extension ne sont pas non plus présentes et lorsque je tente de les utiliser, je reçois l'erreur "Les propriétés d'extension suivantes ne sont pas disponibles: extension_ {app_id} _canViewSoccer . Y at-il quelque chose d'autre me manque?


Salut @JaneQuinn Comment avez-vous créé l'attribut personnalisé? Via le portail Azure ?


C'est vrai, je l'ai créé via le portail Azure. Si j'invite l'application extension_properties de l'application qui les stocke, j'obtiens les propriétés de l'extension, elles ne sont simplement appliquées à aucun de mes utilisateurs. GET https://graph.windows.net/{tenant}.onmicrosoft.com/applicati‌ ons / {application_id} ‌ / extensionProperties‌? api-version = 1.6 "value" : [{"odata.type": "Microsoft.DirectoryServices.ExtensionProperty", "objectType": "ExtensionProperty", "appDisplayName": "", "name": "extension_e716a5725e584d44a366ae39913b50f8_canViewBaseball" ‌,


@ jane-quinn Avez-vous utilisé l'attribut dans un flux d'utilisateurs? Les documents liés par Chris indiquent "Un attribut personnalisé n'est créé que la première fois qu'il est utilisé dans un flux utilisateur, et non lorsque vous l'ajoutez à la liste des attributs utilisateur."


@JaneQuinn En créant un attribut personnalisé, il n'est ajouté à aucun objet utilisateur , donc si vous GET un objet utilisateur , l'attribut personnalisé ne sera pas retourné. Cependant, vous pouvez PATCH un objet user avec un attribut personnalisé, comme décrit dans la réponse ci-dessus.


@ChrisPadgett Si j'essaie de patcher un utilisateur qui n'a pas encore les propriétés d'extension, j'obtiens toujours l'erreur les propriétés d'extension suivantes ne sont pas disponibles . PATCH https://graph.windows.net/{tenant}/users/{user_object_Id}?ap‌ i-version = 1.6 Autorisation: Bearer {Bearer token} ... Content-Type: application / json {" extension_e716a572-5e58-4d44-a366-ae39913b50f8_canViewSocce‌ r ": true}


@Jason J'ai utilisé l'attribut dans un flux d'utilisateurs et j'ai créé des utilisateurs avec cette politique qui ont les attributs personnalisés.


L'attribut personnalisé est-il appelé canViewBaseball ou canViewSoccer ?


@ChrisPadgett Il existe plusieurs propriétés d'extension, canViewBaseball et canViewSoccer en sont quelques-unes, il y en a 5 au total pour divers sports.



1
votes

L'ID d'application de from b2c-extensions-app doit être utilisé sans les tirets dans le nom de la propriété d'extension. C'est à dire.

{ "extension_e716a5725e584d44a366ae39913b50f8_canViewSoccer": true }

devrait être

{ "extension_e716a572-5e58-4d44-a366-ae39913b50f8_canViewSoccer": true }


0 commentaires

1
votes

Voir cet exemple, UserService.CreateUserWithCustomAttribute () : https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/ master / 4-WebApp-votre-API / 4-2-B2C

public static async Task CreateUserWithCustomAttribute(GraphServiceClient graphClient, string b2cExtensionAppClientId, string tenantId)
{
    if (string.IsNullOrWhiteSpace(b2cExtensionAppClientId))
    {
        throw new ArgumentException("B2C Extension App ClientId (ApplicationId) is missing in the appsettings.json. Get it from the App Registrations blade in the Azure portal. The app registration has the name 'b2c-extensions-app. Do not modify. Used by AADB2C for storing user data.'.", nameof(b2cExtensionAppClientId));
    }

    // Declare the names of the custom attributes
    const string customAttributeName1 = "FavouriteSeason";
    const string customAttributeName2 = "LovesPets";

    // Get the complete name of the custom attribute (Azure AD extension)
    Helpers.B2cCustomAttributeHelper helper = new Helpers.B2cCustomAttributeHelper(b2cExtensionAppClientId);
    string favouriteSeasonAttributeName = helper.GetCompleteAttributeName(customAttributeName1);
    string lovesPetsAttributeName = helper.GetCompleteAttributeName(customAttributeName2);

    Console.WriteLine($"Create a user with the custom attributes '{customAttributeName1}' (string) and '{customAttributeName2}' (boolean)");

    // Fill custom attributes
    IDictionary<string, object> extensionInstance = new Dictionary<string, object>();
    extensionInstance.Add(favouriteSeasonAttributeName, "summer");
    extensionInstance.Add(lovesPetsAttributeName, true);

    try
    {
        // Create user
        var result = await graphClient.Users
        .Request()
        .AddAsync(new User
        {
            GivenName = "Casey",
            Surname = "Jensen",
            DisplayName = "Casey Jensen",
            Identities = new List<ObjectIdentity>
            {
                new ObjectIdentity()
                {
                    SignInType = "emailAddress",
                    Issuer = tenantId,
                    IssuerAssignedId = "casey.jensen@example.com"
                }
            },
            PasswordProfile = new PasswordProfile()
            {
                Password = Helpers.PasswordHelper.GenerateNewPassword(4, 8, 4)
            },
            PasswordPolicies = "DisablePasswordExpiration",
            AdditionalData = extensionInstance
        });

        string userId = result.Id;

        Console.WriteLine($"Created the new user. Now get the created user with object ID '{userId}'...");

        // Get created user by object ID
        result = await graphClient.Users[userId]
            .Request()
            .Select($"id,givenName,surName,displayName,identities,{favouriteSeasonAttributeName},{lovesPetsAttributeName}")
            .GetAsync();

        if (result != null)
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine($"DisplayName: {result.DisplayName}");
            Console.WriteLine($"{customAttributeName1}: {result.AdditionalData[favouriteSeasonAttributeName].ToString()}");
            Console.WriteLine($"{customAttributeName2}: {result.AdditionalData[lovesPetsAttributeName].ToString()}");
            Console.WriteLine();
            Console.ResetColor();
            Console.WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
        }
    }
    catch (ServiceException ex) 
    {
        if (ex.StatusCode == System.Net.HttpStatusCode.BadRequest)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine($"Have you created the custom attributes '{customAttributeName1}' (string) and '{customAttributeName2}' (boolean) in your tenant?");
            Console.WriteLine();
            Console.WriteLine(ex.Message);
            Console.ResetColor();
        }                
    }
    catch (Exception ex)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(ex.Message);
        Console.ResetColor();
    }
}

Si vous le souhaitez, vous pouvez éviter d'utiliser les helpers en haut. La clé de chaîne dans le dictionnaire extensionInstance sera "extension_ {app id} _ {property name}" où {app id} est l'id de l'application par défaut créée pour vous avec le nom b2c-extensions-app. Ne modifiez pas. Utilisé par AADB2C pour stocker les données utilisateur.


0 commentaires