Пользовательский UserValidator влияет на вновь созданного пользователя, добавленного в роль - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь создать мультитенантное приложение в ядре asp.net и зарегистрировать удостоверение asp.net следующим образом:

services.AddIdentity<TUserIdentity, TUserIdentityRole>(options => 
{
    options.User.RequireUniqueEmail = false;
})
.AddUserValidator<MultitenantUserValidator<TUserIdentity>>()
    .AddEntityFrameworkStores<TContext>()
    .AddDefaultTokenProviders();

Мой MultitenantUserValidator класс:

public class MultitenantUserValidator<TUser> : IUserValidator<TUser>
    where TUser : UserIdentity
{
    public async Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user)
    {
        bool combinationExists = await manager.Users
        .AnyAsync(x => x.UserName == user.UserName
                    && x.Email == user.Email
                    && x.TenantId == user.TenantId);

        if (combinationExists)
            return IdentityResult.Failed(new IdentityError { Description = "The specified username and email are already registered in the given tentant" });

        return IdentityResult.Success;
    }
}

Это часть моего DbSeedingHelper класса

var result = await userManager.CreateAsync(user, Users.AdminPassword);

if (result.Succeeded)
{
    // Add user to role
    var userRoleresult = await userManager.AddToRoleAsync(user, AuthorizationConsts.AdministrationRole);
}

Когда он выполняет строку для добавления созданного пользователя в роль, результат идентификации завершается с ошибкой из MultitenantUserValidator: "Указанное имя пользователяи электронная почта уже зарегистрирована в данном клиенте ".

Я не знаю, почему он возвращается к валидатору при попытке добавить уже созданного пользователя в роль.Я думал, что он должен вызываться только при создании пользователя.Из-за этого я не могу добавить пользователя в роль.Как я могу решить это?

1 Ответ

0 голосов
/ 30 апреля 2019

Удостоверение пользователя проверяется всякий раз, когда оно обновляется , а не только при его создании. Это делается для того, чтобы пользователь всегда оставался действительным.

Это, очевидно, означает, что ваш валидатор должен также проверять существующих пользователей. Логика, которая проверяет совпадения комбинаций, которые включают самого текущего пользователя, явно не очень хорошая идея.

Лучше проверить, чтобы убедиться, что нет пользователя с такой же комбинацией , который не является тем же пользователем .

bool combinationExists = await manager.Users.AnyAsync(x => x.Id != user.Id && …);

Обратите внимание, что имя пользователя и адрес электронной почты обычно уникальны в ASP.NET Core Identity. Поэтому пользователи не могут иметь двух разных пользователей с одинаковыми именем пользователя и адресом электронной почты.

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

...