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.

Cómo personalizar el proveedor de UserStore para Identity Server y hacer que mi controlador de cuenta funcione junto con IdentityServer.

Estoy trabajando en una nueva aplicación Asp.net core (.Net 5) y necesito implementar un servidor de autenticación utilizando IdentityServer como proveedor de tokens. El cliente nos pidió que no utilicemos Asp.net core Identity y que debemos utilizar ResourceOwnerPasswordValidator y ProfileService.

Logré hacer todo funcionar y obtengo el access_token basado en el UserName y el Password (obtenidos desde la URL/Connect/token), pero falta una parte: el controlador de cuentas (AccountController).

Así que quiero saber cómo hacer que IdentityServer y mi AccountController funcionen juntos. Cuando se invoque la acción de inicio de sesión y la autenticación sea exitosa, quiero invocar el mecanismo de IdentityServer.

Así que chicos, si alguien tiene una pista o cualquier cosa, se agradecería y gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que IdentityServer y su AccountController funcionen juntos, debe integrar el middleware de IdentityServer en su aplicación ASP.NET Core. Este middleware se encargará de las solicitudes de autenticación y emitirá tokens de acceso.

    Aquí están los pasos para integrar IdentityServer:

    1. Instale el paquete NuGet IdentityServer4.AspNetIdentity. Este paquete proporciona el middleware y los servicios necesarios para integrar IdentityServer con ASP.NET Core Identity.
    2. Configure IdentityServer en su archivo Startup.cs. Debe agregar el siguiente middleware al método ConfigureServices:

    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddAspNetIdentity<applicationuser>();
    

    Este código configura IdentityServer con una credencial de firma de desarrollador, recursos y clientes en memoria, y los servicios necesarios de ASP.NET Core Identity.

    1. Implemente las interfaces IResourceOwnerPasswordValidator e IProfileService. Estas interfaces proporcionan la lógica para validar las credenciales del usuario y recuperar la información del perfil del usuario.
    public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
    {
        private readonly UserManager<applicationuser> _userManager;
    
        public ResourceOwnerPasswordValidator(UserManager<applicationuser> userManager)
        {
            _userManager = userManager;
        }
    
        public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
        {
            var user = await _userManager.FindByNameAsync(context.UserName);
            if (user == null)
            {
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "Nombre de usuario o contraseña no válidos");
                return;
            }
    
            var passwordValid = await _userManager.CheckPasswordAsync(user, context.Password);
            if (!passwordValid)
            {
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "Nombre de usuario o contraseña no válidos");
                return;
            }
    
            context.Result = new GrantValidationResult(subject: user.Id, authenticationMethod: "password");
        }
    }
    
    public class ProfileService : IProfileService
    {
        private readonly UserManager<applicationuser> _userManager;
    
        public ProfileService(UserManager<applicationuser> userManager)
        {
            _userManager = userManager;
        }
    
        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            var user = await _userManager.GetUserAsync(context.Subject);
            if (user == null)
            {
                throw new ArgumentException("Identificador de sujeto no válido");
            }
    
            var claims = new List<claim>
            {
                new Claim(ClaimTypes.Name, user.UserName),
                new Claim(ClaimTypes.Email, user.Email)
            };
    
            context.IssuedClaims.AddRange(claims);
        }
    
        public Task IsActiveAsync(IsActiveContext context)
        {
            return Task.CompletedTask;
        }
    }
    

    Estas implementaciones validan las credenciales del usuario y recuperan los datos del perfil del usuario del sistema de ASP.NET Core Identity.

    1. Actualice su AccountController para usar SignInManager para autenticar usuarios y emitir tokens de acceso usando IdentityServer:
    [HttpPost("login")]
    public async Task<iactionresult> Login([FromBody] LoginModel model)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, false, false);
        if (result.Succeeded)
        {
            var user = await _userManager.FindByNameAsync(model.Username);
            var claims = await _userManager.GetClaimsAsync(user);
    
            var token = new JwtSecurityToken(
                issuer: _configuration["Jwt:Issuer"],
                audience: _configuration["Jwt:Audience"],
                claims: claims,
                expires: DateTime.Now.AddMinutes(30),
                signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])), SecurityAlgorithms.HmacSha256)
            );
    
            return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
        }
    
        return Unauthorized();
    }
    

    Este código utiliza SignInManager para autenticar al usuario y recuperar sus reclamaciones del sistema de ASP.NET Core Identity. Luego crea un token de acceso JWT utilizando las reclamaciones y lo devuelve al cliente.

    Con estos pasos, debería poder integrar IdentityServer con su aplicación ASP.NET Core y usar su AccountController para autenticar usuarios y emitir tokens de acceso.

Comments are closed.