自定义UserValidator影响添加到角色的新创建用户

时间:2019-04-30 14:54:41

标签: c# asp.net-core asp.net-identity multi-tenant

我正在尝试在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 :(得分:0)

只要更新,身份用户就会得到验证,而不仅仅是创建时。这是为了确保用户始终保持有效。

这显然意味着您的验证者也应该能够验证现有用户。一种检查匹配组合(其中包括当前用户本身)的逻辑显然不是一个好主意。

更好的检查方法是确保没有用户具有相同的组合不是同一用户

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

请注意,用户名和电子邮件地址通常在ASP.NET Core Identity中都是唯一的。因此,用户不可能拥有两个具有相同用户名和电子邮件地址的不同用户。

如果您希望基于多租户的事实,即可以使用一个用户名/电子邮件向多个租户注册但拥有单独的身份,则此设置不适用于默认设置。