2015-11-19 2 views
3

Мне дано требование предоставить пользователям возможность создавать пользователей через интерфейс без пароля. Я пытаюсь выполнить это с помощью ASP.NET Identity.Создание пользователей без пароля с использованием идентификатора ASP.NET

Я могу успешно создать пользователя без пароля с помощью метода Create в UserManager в:

if (vm.ShouldHavePassword) 
{ 
    userManager.Create(userToInsert, vm.Password); 
} 
else 
{ 
    userManager.Create(userToInsert); 
} 

После вызова метода Create, пользователь получает тест успешно сохранен в нашей таблице AspNetUsers. И когда я не предоставляю пароль, столбец PasswordHash в нашей таблице AspNetUsers устанавливается в NULL.

Моя проблема: я не могу войти в качестве тестового пользователя, у которого нет пароля. Ниже приведен вызов метода, который мы используем для проверки учетных данных пользователя:

result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 

Я попытался войти в систему как тестовый пользователь, который имеет значение NULL PasswordHash несколько раз. Для этого я не предоставляю пароль в нашей форме входа в систему. В результате пароль NULL передается в метод PasswordSignInAsync. Возвращаемое значение этого метода всегда равно SignInStatus.Failure.

Использование идентификатора ASP.NET, как настроить код для правильной аутентификации учетных данных пользователя, когда учетные данные содержат NULL-пароль, а пользователь в базе данных содержит NULL PasswordHash? Возможно ли такое?

+0

Возможный дубликат и/или решение https://stackoverflow.com/questions/28110934/asp-net-mvc-identity-login-without-password –

+0

Я уже видел этот вопрос. Он спрашивал, как я могу войти в систему как пользователь _any_, не предоставляя пароль. Я спрашиваю, как я могу войти в систему как конкретный пользователь, у которого нет пароля, сохраненного в базе данных. –

+0

Понял. Вы попробовали код, который он опубликовал? FindByNameAsync и SignInAsync? –

ответ

0

Я не думаю, что вы можете проверить пользователя без пароля. В качестве временного решения: Вместо пустого пароля, я рекомендую использовать некоторые пустышки/Common пароль из C# код, как при создании пользователя и при проверке учетных данных

При создании пользователя

if (vm.ShouldHavePassword) 
{ 
    userManager.Create(userToInsert, vm.Password); 
} 
else 
{ 
    userManager.Create(userToInsert, "someDummy123$"); 
} 

При проверке

result = await SignInManager.PasswordSignInAsync(model.UserName, "someDummy123$", model.RememberMe, shouldLockout: false); 
3

Да, вы можете. Asp.Net Identity Framework полностью настраивается. Просто переопределить PasswordValidator.ValidateAsync и PasswordHasher.VerifyHashedPassword методы, как это:

internal class CustomPasswordValidator: PasswordValidator 
    { 
     public override async Task<IdentityResult> ValidateAsync(string item) 
     { 
      if (string.IsNullOrEmpty(item)) return IdentityResult.Success; 
      return await base.ValidateAsync(item); 
     } 
    } 

    internal class CustomPasswordHasher : PasswordHasher 
    { 
     public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword) 
     { 
      if (hashedPassword == null && string.IsNullOrEmpty(providedPassword)) 
       return PasswordVerificationResult.Success; 
      return base.VerifyHashedPassword(hashedPassword, providedPassword); 
     } 
    } 

и поставил их так:

 var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); 

     manager.PasswordValidator = new CustomPasswordValidator(); 
     manager.PasswordHasher = new CustomPasswordHasher(); 
1

Хорошо, что вам нужно сделать, это найти пользователя (пользователь AspNetUsers), используя ваш контекст db. После того, как у вас есть пользователь, вы можете проверить, имеет ли их пароль PasswordHash. Если да, то просто петь их в использовании SignInManager.SignIn Если нет, то используйте SignInManager.PasswordSignIn

пример ..

var user = db.AspNetUsers.FirstOrDefault(p=>p.UserName); //alternatively, you can find the user using Email, Id or some other unique field 
if(user.PasswordHash == null) 
    await SignInManager.SignInAsync(user, true, true); 
else 
    await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 

Надеется, что это помогает.

Смежные вопросы