¿Cómo agregar notificaciones personalizadas para acceder al token en IdentityServer4?

Estoy usando IdentityServer4 .

Quiero agregar otras notificaciones personalizadas para acceder al token pero no puedo hacer esto. He modificado Quickstart5 y he agregado ASP.NET Identity Core y las notificaciones personalizadas a través de ProfileService como se sugiere por Coemgen a continuación .

Puede descargar mi código aquí: [paquete zip] [3]. (Se basa en: Quickstart5 con ASP.NET Identity Core y reclamaciones agregadas a través de ProfileService).

Problema: GetProfileDataAsync no se ejecuta.

Debes implementar tu propio ProfileService. Eche un vistazo en esta publicación que seguí cuando implementé la misma: https://damienbod.com/2016/11/18/extending-identity-in-identityserver4-to-manage-users-in-asp-net-core /

Aquí hay un ejemplo de mi propia implementación:

public class ProfileService : IProfileService { protected UserManager _userManager; public ProfileService(UserManager userManager) { _userManager = userManager; } public Task GetProfileDataAsync(ProfileDataRequestContext context) { //>Processing var user = _userManager.GetUserAsync(context.Subject).Result; var claims = new List { new Claim("FullName", user.FullName), }; context.IssuedClaims.AddRange(claims); //>Return return Task.FromResult(0); } public Task IsActiveAsync(IsActiveContext context) { //>Processing var user = _userManager.GetUserAsync(context.Subject).Result; context.IsActive = (user != null) && user.IsActive; //>Return return Task.FromResult(0); } 

}

No olvides agregar esta línea en tu Startup.cs

 services.AddTransient(); 

Ok, el problema aquí es este:

Si bien ha configurado correctamente sus recursos de Identidad disponibles (tanto estándar como personalizados), también necesita definir explícitamente cuáles son una necesidad al llamar a su recurso de API . Para definir esto, debe ir a su clase ExampleIdentityServer proyecto ExampleIdentityServer y proporcionar un tercer argumento como en el new ApiResouirce constructor new ApiResouirce . Solo esos serán incluidos en el access_token

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

En esencia, esto significa que configuré mis notificaciones de identidad para mi organización, pero puede haber más de una API involucrada y no todas las API hacen uso de todas las notificaciones de perfil disponibles. Esto también significa que estos estarán presentes dentro de su ClaimsPrincipal todo el rest aún se puede acceder a través del punto final “userinfo” como una llamada http normal.

NOTA: con respecto a los tokens de actualización:

Si eligió habilitar los tokens de actualización a través de AllowOfflineAccess = true , puede experimentar el mismo comportamiento al actualizar el access_token “¡ GetProfileDataAsync no se ejecuta! “. Por lo tanto, las reclamaciones dentro de access_token permanecen igual, aunque se obtiene un nuevo access_token con una vida útil actualizada. Si ese es el caso, puede forzarlos a que siempre se actualicen desde el servicio de Perfil configurando UpdateAccessTokenClaimsOnRefresh=true en la configuración del cliente.

Problema encontrado.

En startup.cs en lugar de agregar “services.AddTransient ();”

Agregue “.AddProfileService ()” a services.AddIdentityServer ()

Terminarás con

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

Gracias por ayudar a Coemgen! No hay nada malo con el código, solo el inicio fue incorrecto.

Puede incluir cualquier reclamación usando la opción UserClaims en su GetIdentityResources () en la clase de configuración:

Reclamaciones de usuarios: lista de tipos de reclamaciones de usuarios asociados que deben incluirse en el token de identidad. (Según la documentación oficial) http://docs.identityserver.io/en/release/reference/identity_resource.html#refidentityresource