c# - parte - asp net core 2.1 identity
El proveedor de identidad de ASP.NET SignInManager sigue devolviendo errores (8)
Tengo un problema con el proveedor de identidad ASP estándar para MVC5. Tan pronto como inicie sesión en el método:
await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
sigue devolviendo el fracaso. Así que empecé a depurar, usando:
UserManager.FindByEmail(model.Email);
Esto devuelve un ID de usuario válido para mi usuario que intenta iniciar sesión. Luego utilicé:
SignInManager.UserManager.CheckPassword(UserIDObtainedFromFind, model.Password);
Y esto devuelve verdadero, lo que significa que la contraseña que proporciono es válida ...
¿Alguna idea sobre cómo puedo rastrear, de depurar el método SignInManager.PasswordSignInAsync para ver dónde falla?
En caso de que ninguno de los anteriores sea su causa del problema (en mi caso, el problema fue copiar y pegar un error en mi propia implementación de IUserStore) y responder a su pregunta " Cualquier idea sobre cómo puedo rastrear o depurar el SignInManager. ¿Método de PasswordSignInAsync para ver dónde falla? ", Una forma de depurar sería copiar el contenido del método SignInManager.PasswordSignInAsync en su propia clase derivada (ApplicationSignInManager).
Puede encontrar el código fuente here o here si está usando MVC5 y más bajo.
En su cheque de inicio:
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
Si se configuran en verdadero, debe confirmar el correo electrónico o el número de teléfono antes de iniciar sesión.
Es un trabajo para mi
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
Para mí, me resultó útil usar el Analizador de SQL para ver la consulta a la que estaba llamando PasswordSignInAsync. En mi caso, noté que estaba tratando de encontrar un usuario con un Discriminador configurado en "UserContext". Por supuesto, esto no funcionaba para mí porque actualicé los Servicios de membresía de ASP.NET y este discriminador se configuró como Usuario. Dado que el nuevo código utiliza Entity Framework, parece que este valor se deriva de la clase que usa para su usuario. Una declaración de actualización rápida solucionó el problema.
UPDATE AspNetUsers SET Discriminator = ''UserContext'' WHERE Discriminator = ''User''
Poco viejo ahora, pero aquí está mi tuppence sobre este tema.
Estaba haciendo algo de creación de datos estáticos en una utilidad para garantizar que algunas cosas estándar estuvieran presentes en la base de datos de Identidad (roles y una cuenta de administrador).
Estaba creando las entidades y hablando directamente al contexto para crear cualquier rol faltante o ese usuario. El problema que tuve fue que no estaba configurando los campos NormalizedUserName
y NormalizedEmail
. Simplemente estaba configurando Email
y UserName
.
El código final que uso (con EF Core 2.x) es algo como:
if (!_context.Users.Any(_ => _.Id.Equals(Users.AdministratorId)))
{
var user = new ApplicationUser
{
Id = Users.AdministratorId,
UserName = Users.AdministratorEmail,
Email = Users.AdministratorEmail,
EmailConfirmed = true,
NormalizedEmail = Users.AdministratorEmail.ToUpper(),
NormalizedUserName = Users.AdministratorEmail.ToUpper(),
SecurityStamp = Guid.NewGuid().ToString()
};
var hasher = new PasswordHasher<ApplicationUser>();
user.PasswordHash = hasher.HashPassword(user, "our_password");
_context.Users.Add(user);
}
Si username != email
:
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
SignInManager.PasswordSignIn funciona a partir del nombre de usuario, debe verificar que el nombre de usuario sea el mismo que el correo electrónico que está pasando.
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName,
model.Password, model.RememberMe, shouldLockout: false);
Esto funcionó para mí porque mi nombre de usuario no era igual a mi correo electrónico. Su correo electrónico y nombre de usuario deben ser los mismos.