es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agregar un parámetro personalizado en angular-auth-oidc-client y acceder a este en .net core identityserver4.

Quiero agregar un parámetro personalizado al método authorize de angular-auth-oidc-client de esta manera. Con el parámetro personalizado en este caso client_id, quiero escribir alguna lógica personalizada.

export class LoginComponent implements OnInit {

     constructor(private oidcSecurityService: OidcSecurityService) {
    }

     ngOnInit() {
        this.oidcSecurityService.authorize({customParams: { 'client_id': 'F93C5C9E-57DC-4889-86DD-66A98EAD94CC' } });
    }
}

En el backend he configurado identityserver4 en una aplicación de .net core 3.1. También he implementado un servicio de perfil personalizado ProfileService.

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

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

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        //Procesamiento
        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)
    {
        //Procesamiento
        var user = await _userManager.GetUserAsync(context.Subject);

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

Además, en startup.cs:

services.AddIdentityServer()
    .AddProfileService<profileservice>();

¿Cómo puedo acceder al parámetro personalizado que se envía desde el cliente oidc de Angular en mi aplicación de .net core?

Si se necesita información adicional, házmelo saber.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para acceder al parámetro personalizado que se envía desde el cliente oidc de Angular en una aplicación .NET Core, puedes utilizar el objeto ProfileDataRequestContext que se pasa como parámetro al método GetProfileDataAsync en el ProfileService.

    Puedes modificar la clase ProfileService para agregar una propiedad que almacene el client_id y lo envíe como una afirmación en la lista de afirmaciones emitidas. Aquí tienes un ejemplo:

    public class ProfileService : IProfileService
    {
        protected UserManager<ApplicationUser> _userManager;
        protected string _clientId;
    
        public ProfileService(UserManager<ApplicationUser> userManager, IHttpContextAccessor httpContextAccessor)
        {
            _userManager = userManager;
    
            var httpContext = httpContextAccessor.HttpContext;
            _clientId = httpContext?.Request.Query["client_id"];
        }
    
        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            //> Procesamiento
            var user = await _userManager.GetUserAsync(context.Subject);
    
            var claims = new List<Claim>
            {
                new Claim("FullName", user.FullName),
                new Claim("client_id", _clientId),
            };
    
            context.IssuedClaims.AddRange(claims);
        }
    
        public async Task IsActiveAsync(IsActiveContext context)
        {
            //> Procesamiento
            var user = await _userManager.GetUserAsync(context.Subject);
    
            context.IsActive = (user != null) && user.IsActive;
        }
    }
    

    En este ejemplo, el constructor de ProfileService toma un parámetro IHttpContextAccessor para acceder al contexto HTTP actual, y recupera el valor del client_id de la cadena de consulta de la solicitud. Luego, en el método GetProfileDataAsync, agrega una nueva afirmación para el parámetro client_id a la lista de afirmaciones emitidas.

    Ten en cuenta que IHttpContextAccessor debe estar registrado en el contenedor de inyección de dependencias. Puedes hacer esto en tu archivo startup.cs, agregando la siguiente línea al método ConfigureServices:

    services.AddHttpContextAccessor();
    

    Con esta configuración, ahora puedes acceder a la afirmación client_id en tus controladores o middleware de backend, utilizando la propiedad HttpContext.User.Claims. Por ejemplo:

    [HttpGet]
    public IActionResult MyAction()
    {
        var clientIdClaim = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "client_id");
        if (clientIdClaim != null)
        {
            var clientId = clientIdClaim.Value;
            // hace algo con clientId
        }
        // ...
    }
    

Comments are closed.