Подтвердить что ты не робот

ASP.net Identity Отключить пользователя

Использование нового идентификатора ASP.net в MVC 5, Как отключить пользователя от входа? Я не хочу их удалять, возможно, просто отключить их учетную запись за период времени.

Есть ли у кого-нибудь идеи по этому поводу, поскольку я не вижу столбец статуса или что-либо в таблице ASPNetUsers.

4b9b3361

Ответ 1

Обновить. Как отмечает CountZero, если вы используете v2.1 +, тогда вы должны попробовать и использовать функциональные возможности блокировки, которые они добавили в первую очередь, прежде чем попробовать решение ниже. См. Их сообщение в блоге для полного образца: http://blogs.msdn.com/b/webdev/archive/2014/08/05/announcing-rtm-of-asp-net-identity-2-1-0.aspx


Версия 2.0 имеет интерфейс IUserLockoutStore, который можно использовать для блокировки пользователей, но недостатком является то, что нет функциональности OOB, чтобы фактически использовать ее за пределами сквозных методов, открытых классом UserManager. Например, было бы неплохо, если бы это фактически увеличило количество блокировок как часть стандартного процесса проверки имени пользователя и пароля. Однако, это довольно тривиально, чтобы реализовать себя.

Шаг # 1. Создайте пользовательское хранилище, которое реализует IUserLockoutStore.

// I'm specifying the TKey generic param here since we use int for our DB keys
// you may need to customize this for your environment
public class MyUserStore : IUserLockoutStore<MyUser, int>
{
    // IUserStore implementation here

    public Task<DateTimeOffset> GetLockoutEndDateAsync(MyUser user)
    {
        //..
    }

    public Task SetLockoutEndDateAsync(MyUser user, DateTimeOffset lockoutEnd)
    {
        //..
    }

    public Task<int> IncrementAccessFailedCountAsync(MyUser user)
    {
        //..
    }

    public Task ResetAccessFailedCountAsync(MyUser user)
    {
        //..
    }

    public Task<int> GetAccessFailedCountAsync(MyUser user)
    {
        //..
    }

    public Task<bool> GetLockoutEnabledAsync(MyUser user)
    {
        //..
    }

    public Task SetLockoutEnabledAsync(MyUser user, bool enabled)
    {
        //..
    }
}

Шаг # 2. Вместо UserManager используйте следующие классы в действиях входа/выхода из системы, передав им экземпляр вашего пользовательского хранилища.

public class LockingUserManager<TUser, TKey> : UserManager<TUser, TKey>
    where TUser : class, IUser<TKey> 
    where TKey : IEquatable<TKey> 
{
    private readonly IUserLockoutStore<TUser, TKey> _userLockoutStore;

    public LockingUserManager(IUserLockoutStore<TUser, TKey> store)
        : base(store)
    {
        if (store == null) throw new ArgumentNullException("store");

        _userLockoutStore = store;
    }

    public override async Task<TUser> FindAsync(string userName, string password)
    {
        var user = await FindByNameAsync(userName);

        if (user == null) return null;

        var isUserLockedOut = await GetLockoutEnabled(user);

        if (isUserLockedOut) return user;

        var isPasswordValid = await CheckPasswordAsync(user, password);

        if (isPasswordValid)
        {
            await _userLockoutStore.ResetAccessFailedCountAsync(user);
        }
        else
        {
            await IncrementAccessFailedCount(user);

            user = null;
        }

        return user;
    }

    private async Task<bool> GetLockoutEnabled(TUser user)
    {
        var isLockoutEnabled = await _userLockoutStore.GetLockoutEnabledAsync(user);

        if (isLockoutEnabled == false) return false;

        var shouldRemoveLockout = DateTime.Now >= await _userLockoutStore.GetLockoutEndDateAsync(user);

        if (shouldRemoveLockout)
        {
            await _userLockoutStore.ResetAccessFailedCountAsync(user);

            await _userLockoutStore.SetLockoutEnabledAsync(user, false);

            return false;
        }

        return true;
    }

    private async Task IncrementAccessFailedCount(TUser user)
    {
        var accessFailedCount = await _userLockoutStore.IncrementAccessFailedCountAsync(user);

        var shouldLockoutUser = accessFailedCount > MaxFailedAccessAttemptsBeforeLockout;

        if (shouldLockoutUser)
        {
            await _userLockoutStore.SetLockoutEnabledAsync(user, true);

            var lockoutEndDate = new DateTimeOffset(DateTime.Now + DefaultAccountLockoutTimeSpan);

            await _userLockoutStore.SetLockoutEndDateAsync(user, lockoutEndDate);
        }
    }
}

Пример:

    [AllowAnonymous]
    [HttpPost]
    public async Task<ActionResult> Login(string userName, string password)
    {
        var userManager = new LockingUserManager<MyUser, int>(new MyUserStore())
        {
            DefaultAccountLockoutTimeSpan = /* get from appSettings */,
            MaxFailedAccessAttemptsBeforeLockout = /* get from appSettings */
        };

        var user = await userManager.FindAsync(userName, password);

        if (user == null)
        {
            // bad username or password; take appropriate action
        }

        if (await _userManager.GetLockoutEnabledAsync(user.Id))
        {
            // user is locked out; take appropriate action
        }

        // username and password are good
        // mark user as authenticated and redirect to post-login landing page
    }

Если вы хотите вручную заблокировать кого-то, вы можете установить любой флаг, который вы проверяете, в MyUserStore.GetLockoutEnabledAsync().

Ответ 2

await userManager.SetLockoutEnabledAsync(applicationUser.Id, true);
await userManager.SetLockoutEndDateAsync(DateTime.Today.AddYears(10));

Ответ 3

UserManager.RemovePasswordAsync("userId") будет эффективно отключать пользователя. Если у пользователя нет пароля, он не сможет войти в систему. Вам нужно будет установить новый пароль, чтобы снова включить пользователя.

Ответ 4

У вас может быть новый класс, который должен быть получен из класса IdentityUser. Вы можете добавить логическое свойство в новый класс и можете использовать это новое свойство, чтобы заботиться о чеке для процесса входа в систему. Я также сделал это довольно хорошо. Я мог бы взглянуть на: блог