net ejemplos bearer asp c# asp.net-core oauth-2.0 openid identityserver4

c# - ejemplos - identity server 4 asp.net core 2



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

Ok, el problema aquí es este:

A pesar de que 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<ApiResource> GetApiResources() { return new List<ApiResource> { 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 resto todavía 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 siguen siendo las mismas, 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.

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 en Coemgen a below .

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<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; }

}

No olvides añadir esta línea en tu Startup.cs.

services.AddTransient<IProfileService, ProfileService>();


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<ApplicationUser>() .AddProfileService<ProfileService>();

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