74 votes

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

Je suis à l'aide de IdentityServer4.

Je veux ajouter d'autres revendications personnalisés à jeton d'accès mais je ne suis pas en mesure de le faire. J'ai modifié Quickstart5 et a ajouté ASP.NET l'Identité de Base et les revendications personnalisées via ProfileService comme suggéré par Coemgen ci-dessous.

Vous pouvez télécharger mon code ici: [package zip][3]. (Il est basé sur: Quickstart5 avec ASP.NET l'Identité de Base et ajouté les demandes par la ProfileService).

Question: GetProfileDataAsync n'est pas exécutée.

116voto

Blennouill Points 829

Vous devez mettre en place votre propre ProfileService. Jetez un oeil à ce post que j'ai suivi quand j'ai mis en œuvre la 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 mise en œuvre :

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 Démarrage.cs

services.AddTransient<IProfileService, ProfileService>();

53voto

cleftheris Points 459

Ok le problème est ici:

bien que vous avez configuré votre disposition Identité correctement les ressources (à la fois standard et personnalisés), vous devez également définir explicitement ceux qui sont une nécessité lors de l'appel de votre api de ressources. Afin de définir ce que vous devez aller pour votre Config.cs classe ExampleIdentityServer projet et de fournir un troisième argument, comme sur l' new ApiResouirce constructeur. Seuls ceux-ci seront inclus dans l' 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 j'ai eu mon identité des revendications configuré pour mon organisation, mais il peut y avoir plus d'une Api impliquées et non l'ensemble de l'Api de faire usage de tous les profil de revendications. Cela signifie également que ces sera présent à l'intérieur de votre ClaimsPrincipal tout le reste sera toujours possible d'accéder par le biais de la "userinfo" comme un point de terminaison http appel.

REMARQUE: en ce qui concerne l'actualisation des jetons:

Si vous avez choisi d'activer l'actualisation des jetons via AllowOfflineAccess = true, vous pouvez rencontrer le même comportement lors de l'actualisation de l'access_token "GetProfileDataAsync n'a pas exécuté!". Donc, les revendications à l'intérieur de l'access_token rester le même, bien que vous obtenez une nouvelle access_token avec mise à jour à vie. Si c'est le cas, vous pouvez les forcer à toujours actualiser à partir du Profil de service en définissant UpdateAccessTokenClaimsOnRefresh=true sur la configuration du client.

43voto

001 Points 7736

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.

2voto

JayDeeEss Points 898

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X