Consultar correo electrónico confirmado para iniciar sesión con OAuth2 en IdentityServer4

Estoy usando IdentityServer4 en mi proyecto de API web OAuth2 autenticación. Sin embargo, necesito hacer un cheque para comprobar si el usuario que quiere autenticar es con el correo electrónico confirmado (básicamente, comprobar si el EmailConfirmed es true).

Después de investigar el tema, encontré un respuesta que puede satisfacer mi necesidad - la segunda respuesta menciona una ApplicationOAuthProvider.cs, pero no estoy seguro de cómo utilizarlo en mi proyecto Asp.Net Core 3.1.

Pregunta hecha hace 3 años, 4 meses, 25 días - Por geekglitcher


3 Respuestas:

  • Una opción es comprobar que la reclamación de EmailConfirmed se establece en verdaderos/sí en las políticas de autorización del cliente. También puede utilizar uno de los manipuladores del evento para capturar esto y redirigir al usuario a otra página si esta reclamación no está establecida.

    Respondida el Dec 20, 2020 a las 21:28 - por algorithmarchitect

    Votos positivos: 0 | Votos negativos: 0

  • Para asegurarte de que solo los usuarios con el correo electrónico confirmado puedan iniciar sesión a través de OAuth2 en IdentityServer4 en tu proyecto de Asp.Net Core 3.1, necesitarás implementar una lógica adicional para verificar si el usuario tiene el flag EmailConfirmed establecido en true. Puedes lograr esto realizando las siguientes acciones:

    • Crear una clase personalizada que herede de `OAuthAuthorizationProvider` y sobrescriba el método `GrantResourceOwnerCredentials` para incluir la lógica de verificación del `EmailConfirmed`.
    csharp
    using IdentityServer4.Services;
    using IdentityServer4.Stores;
    using Microsoft.AspNetCore.Identity;
    
    public class CustomOAuthAuthorizationProvider : OAuthAuthorizationProvider
    {
        private readonly UserManager _userManager;
    
        public CustomOAuthAuthorizationProvider(UserManager userManager, ITokenService tokens, IClientStore clients, IResourceStore resources, IEventService events) 
            : base(tokens, clients, resources, events)
        {
            _userManager = userManager;
        }
    
        public override async Task ValidateResourceOwnerCredentials(ResourceOwnerPasswordValidationContext context)
        {
            var user = await _userManager.FindByNameAsync(context.UserName);
            if (user != null && await _userManager.CheckPasswordAsync(user, context.Password) && user.EmailConfirmed)
            {
                context.Result = new GrantValidationResult(user.Id.ToString(), "password");
            }
            else
            {
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "The user email is not confirmed.");
            }
        }
    }
    
    • Registra tu clase personalizada en el contenedor de dependencias de ASP.NET Core y especifica este proveedor personalizado en la configuración de IdentityServer4.
    csharp
    services.AddTransient();
    

    Con esto, tu proveedor personalizado de OAuth2 verificará que el correo electrónico del usuario esté confirmado antes de permitir la autenticación. Asegúrate de ajustar ApplicationUser, UserManager<ApplicationUser> y las dependencias en el constructor de CustomOAuthAuthorizationProvider según tu configuración específica.

    Esta implementación te permitirá controlar el acceso de los usuarios a través de OAuth2 en IdentityServer4 solo para aquellos con el correo electrónico confirmado. ¡Espero que esta solución te haya sido útil! Si tienes más preguntas o dudas, no dudes en consultarme.

    Respondida el Dec 21, 2020 a las 21:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para utilizar el ApplicationOAuthProvider.cs en tu proyecto ASP.NET Core 3.1 para comprobar si el correo electrónico del usuario está confirmado, sigue estos pasos:

    • Crea una nueva clase llamada `ApplicationOAuthProvider` en tu proyecto. Esta clase debe implementar la interfaz `IOAuthProvider`. Aquí tienes un ejemplo:
    csharp
    using IdentityServer4.Validation;
    using Microsoft.AspNetCore.Authentication;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Threading.Tasks;
    
    namespace YourProjectNamespace
    {
        public class ApplicationOAuthProvider : IOAuthProvider
        {
            private readonly ILogger _logger;
    
            public ApplicationOAuthProvider(ILogger logger)
            {
                _logger = logger;
            }
    
            public async Task ValidateAsync(OAuthValidationContext context)
            {
                // Aquí puedes recuperar el correo electrónico del contexto y comprobar si está confirmado.
                // Si el correo electrónico no está confirmado, devuelve un error.
    
                // Ejemplo:
                string email = context.Request.Subject;
                if (! await _userManager.IsEmailConfirmedAsync(email))
                {
                    _logger.LogError("El correo electrónico no está confirmado.");
                    return OAuthValidationResult.Failed("El correo electrónico no está confirmado.");
                }
    
                return OAuthValidationResult.Success();
            }
        }
    }
    
    • Registra tu `ApplicationOAuthProvider` en el contenedor de dependencias de IdentityServer4. Puedes añadirlo al método `ConfigureServices` de tu `Startup.cs`:
    csharp
    services.AddIdentityServer()
        .AddAspNetIdentity()
        .AddInMemoryIdentityResources(Config.IdentityResources)
        .AddInMemoryApiScopes(Config.ApiScopes)
        .AddInMemoryClients(Config.Clients)
        // Registra tu ApplicationOAuthProvider
        .AddExtensionGrantValidator();
    
    • Asegúrate de que has habilitado el flujo de "concesión de extensión" en tu configuración de IdentityServer4. Puedes hacerlo añadiendo `GrantTypes.Extension` a la propiedad `AllowedGrantTypes` de tu cliente:
    csharp
    new Client
    {
        ClientId = "your-client-id",
        AllowedGrantTypes = GrantTypes.Extension,
        ...
    }
    
    • Ahora deberías poder utilizar tu `ApplicationOAuthProvider` para comprobar si el correo electrónico del usuario está confirmado antes de permitirles iniciar sesión.

    Ten en cuenta que el código de ejemplo proporcionado es solo una guía y puede que tengas que adaptarlo a tu escenario específico.

    Respondida el Dec 21, 2020 a las 21:32 - por Gemini

    Votos positivos: 0 | Votos negativos: 0