2015-05-26 2 views
1

Я добавил удаленный столбец в таблицу «Мои пользователи», но, очевидно, регистрация метода новых пользователей, предоставляемых системой Identity, по-прежнему видит этих пользователей в базе данных, есть способ сказать ему игнорировать определенная колонка?Добавление мягкого удаления в таблицу пользователей Identity

Регистрация

// this needs to ignore any DeletedAt where not null 
var result = await UserManager.CreateAsync(user, model.Password); 
if (result.Succeeded) 
{ 
    ... 
} 

Вход в

// this needs to ignore any DeletedAt where not null 
result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: true); 

... И любые другие внешний вход вещи происходит нужно говорить о колонке.

+0

Для входа: вы хотите проверить, был ли пользователь удален и не разрешил ему войти в систему? О регистрации в чем проблема? – tmg

+0

Просто наследовать от 'SignInManager' и добавить проверку на' IsDeleted' – trailmax

+0

tmg - я не хочу, чтобы методы входа в систему позволяли удаленным пользователям входить в систему .../Thanks trailmax – Jimmyt1988

ответ

2

Внутри вашего signInManager перезаписать метод SignInAsync, это одна используется в каждом входа proccess (локальный или внешний)

public class ApplicationSignInManager : SignInManager<User, int> 
{  

    public override async Task SignInAsync(User user, bool isPersistent, bool rememberBrowser) 
    { 
     if (!user.isDeleted) 
     { 
      await base.SignInAsync(user, isPersistent, rememberBrowser); 
     } 
     else 
     { 
      ... 
     }      
    } 
} 

Или создать пользовательский UserStore и переопределить GetUserAggregateAsync метод (его называют внутри все «найти» методы):

public class CustomUserStore : UserStore<ApplicationUser> 
{ 
    public CustomUserStore(ApplicationDbContext context) : base(context) { } 

    protected override async Task<ApplicationUser> GetUserAggregateAsync(Expression<Func<ApplicationUser, bool>> filter) 
    { 
     var user = await base.GetUserAggregateAsync(filter); 

     // if user is found but soft deleted then ignore and return null 
     if (user != null && user.IsDeleted) 
     { 
      return null; 
     } 

     return user; 
    } 
} 
+0

Просто интересно, как бы вы справились с [else] в этом дело? Я предполагаю, что мне нужно вернуть модель [SignInStatus] со значением [Failure], чтобы он выглядел так, как будто пользователь не существует, но параметр nores return не используется. Что бы вы сделали, чтобы сделать так, чтобы он возвращался с ошибкой, поэтому он отображается на экране (т. Е. Для входа в систему, скажите, проверьте свои данные и повторите попытку, потому что логина не существует) – Hanho

+0

@Hanho Вы правы, вы не можете верните 'SignInStatus'. Вы можете попробовать создать пользовательский «UserStore» и отфильтровать пользователей «IsDeleted», чтобы методы «UserManager» с возвратом «сбой» при попытке получить пользователя – tmg

+0

Я пытался сделать то, что вы предложили в прошлом месяц, и я до сих пор не могу понять, где разместить это. Я попытался переопределить пользовательский объект в пользовательском хранилище пользователей (только для того, чтобы узнать, что я не могу его фильтровать с помощью linq и помещать его обратно в IDBS-код - безопасно отбрасывая его в IDBSet, возвращает нуль). То же самое в ApplicationDbContext. Я попытался в методе FindByIdAsync, проверив, удалился ли там пользователь и вернул 0 (какой вид работ), но если вы вернете 0, он возвращает исключение - не то, что я ожидал. Любая идея о том, где я могу продолжить? Спасибо – Hanho

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