web-dev-qa-db-fra.com

Comment ajouter des revendications personnalisées pour accéder au jeton dans IdentityServer4?

J'utilise IdentityServer4 .

Je souhaite ajouter d'autres revendications personnalisées pour le jeton d'accès, mais je ne peux pas le faire. J'ai modifié Quickstart5 et ajouté ASP.NET Identity Core et les revendications personnalisées via ProfileService, comme suggéré par Coemgen ci-dessous .

Vous pouvez télécharger mon code ici: [Zip package] [3]. (Il est basé sur: Quickstart5 avec ASP.NET Identity Core et des revendications ajoutées via ProfileService).

Problème: GetProfileDataAsync n'est pas exécuté.

35
001

Vous devriez implémenter votre propre ProfileService. Jetez un coup d'oeil dans ce post que j'ai suivi lorsque j'ai mis en œuvre le même:

https://damienbod.com/2016/11/18/extending-identity-in-identityserver4-to-manage-users-in-asp-net-core/

Voici un exemple de ma propre implémentation:

public class ProfileService : IProfileService
{
    protected UserManager<ApplicationUser> _userManager;

    public ProfileService(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        //>Processing
        var user = await _userManager.GetUserAsync(context.Subject);

        var claims = new List<Claim>
        {
            new Claim("FullName", user.FullName),
        };

        context.IssuedClaims.AddRange(claims);
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        //>Processing
        var user = await _userManager.GetUserAsync(context.Subject);

        context.IsActive = (user != null) && user.IsActive;
    }
}

N'oubliez pas d'ajouter cette ligne dans votre Startup.cs

services.AddTransient<IProfileService, ProfileService>();
46
Blennouill

Ok la question ici est la suivante:

bien que vous ayez configuré correctement vos ressources disponibles Identity (standard et personnalisées), vous devez également définir explicitement lesquelles sont une nécessité lorsque vous appelez votre api ressource. Pour définir ceci, vous devez vous rendre à votre Config.cs classe sur ExampleIdentityServer projet et fournit un troisième argument comme sur le new ApiResouirce constructeur. Seuls ceux-ci seront inclus dans le access_token

// scopes define the API resources in your system
public static IEnumerable<ApiResource> GetApiResources()
{
    return new List<ApiResource>
    {
        new ApiResource("api1", "My API", new[] { JwtClaimTypes.Subject, JwtClaimTypes.Email, JwtClaimTypes.Phone, etc... })
    };
}

En substance, cela signifie que mes revendications d'identité ont été configurées pour mon organisation mais que plusieurs API sont impliquées et que toutes les API n'utilisent pas toutes les revendications de profil disponibles. Cela signifie également que ceux-ci seront présents dans votre ClaimsPrincipal tout le reste peut encore être accédé via le point de terminaison "userinfo" en tant qu'appel http normal.

NOTE: concernant les jetons d'actualisation:

Si vous avez choisi d'activer les jetons d'actualisation via AllowOfflineAccess = true, vous pouvez rencontrer le même comportement lors de l’actualisation de la méthode access_token "GetProfileDataAsync ne s’exécute pas!". Ainsi, les revendications à l'intérieur de access_token restent inchangées bien que vous obteniez un nouvel access_token avec une durée de vie mise à jour. Si tel est le cas, vous pouvez les forcer à toujours s'actualiser à partir du service de profil en définissant UpdateAccessTokenClaimsOnRefresh=true sur la configuration du client.

26
cleftheris

Problème trouvé.

Dans startup.cs au lieu d'ajouter "services.AddTransient ();"

Ajoutez ".AddProfileService ()" à services.AddIdentityServer ()

Vous allez vous retrouver avec

        services.AddIdentityServer()
            .AddTemporarySigningCredential()
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients())
            .AddAspNetIdentity<ApplicationUser>()
            .AddProfileService<ProfileService>();

Merci à Coemgen pour son aide! rien de mal avec le code, juste le démarrage était faux.

17
001

Vous pouvez inclure n'importe quelle revendication en utilisant l'option UserClaims dans votre GetIdentityResources () dans la classe de configuration:

UserClaims: Liste des types de revendication d'utilisateur associés à inclure dans le jeton d'identité. (Selon la documentation officielle) http://docs.identityserver.io/fr/release/reference/identity_resource.html#refidentityresource

2
JayDeeEss