自定义 UserValidator 影响新创建的添加到角色的用户
Custom UserValidator Affects Newly Created User Added to a Role
我正在尝试在 asp.net 核心中构建多租户应用程序并注册 asp.net 身份,如下所示:
services.AddIdentity<TUserIdentity, TUserIdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddUserValidator<MultitenantUserValidator<TUserIdentity>>()
.AddEntityFrameworkStores<TContext>()
.AddDefaultTokenProviders();
我的MultitenantUserValidator
class:
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
Class
var result = await userManager.CreateAsync(user, Users.AdminPassword);
if (result.Succeeded)
{
// Add user to role
var userRoleresult = await userManager.AddToRoleAsync(user, AuthorizationConsts.AdministrationRole);
}
当它执行将创建的用户添加到角色的行时,身份结果失败并出现来自 MultitenantUserValidator
的错误:"The specified username and email are already registered in the given tenant".
我不知道为什么在尝试将已创建的用户添加到角色时返回到验证器。我认为它只意味着在创建用户时被调用。因此,我无法将用户添加到角色。我该如何解决?
身份用户在 更新 时进行验证,而不仅仅是在创建时进行验证。这是为了确保用户始终保持有效。
这显然意味着您的验证器也应该能够验证 现有 用户。检查匹配组合(包括当前用户本身)的逻辑显然不是一个好主意。
更好的检查是确保没有具有相同组合的用户不是同一用户。
bool combinationExists = await manager.Users.AnyAsync(x => x.Id != user.Id && …);
请注意,用户名和电子邮件地址在 ASP.NET Core Identity 中通常是唯一的。所以用户不可能有两个具有相同用户名和电子邮件地址的不同用户。
如果您希望您的多租户基于这样一个事实,即您可以使用单个 username/email 注册到多个租户但具有单独的身份,那么这不适用于默认设置。
我正在尝试在 asp.net 核心中构建多租户应用程序并注册 asp.net 身份,如下所示:
services.AddIdentity<TUserIdentity, TUserIdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddUserValidator<MultitenantUserValidator<TUserIdentity>>()
.AddEntityFrameworkStores<TContext>()
.AddDefaultTokenProviders();
我的MultitenantUserValidator
class:
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
Class
var result = await userManager.CreateAsync(user, Users.AdminPassword);
if (result.Succeeded)
{
// Add user to role
var userRoleresult = await userManager.AddToRoleAsync(user, AuthorizationConsts.AdministrationRole);
}
当它执行将创建的用户添加到角色的行时,身份结果失败并出现来自 MultitenantUserValidator
的错误:"The specified username and email are already registered in the given tenant".
我不知道为什么在尝试将已创建的用户添加到角色时返回到验证器。我认为它只意味着在创建用户时被调用。因此,我无法将用户添加到角色。我该如何解决?
身份用户在 更新 时进行验证,而不仅仅是在创建时进行验证。这是为了确保用户始终保持有效。
这显然意味着您的验证器也应该能够验证 现有 用户。检查匹配组合(包括当前用户本身)的逻辑显然不是一个好主意。
更好的检查是确保没有具有相同组合的用户不是同一用户。
bool combinationExists = await manager.Users.AnyAsync(x => x.Id != user.Id && …);
请注意,用户名和电子邮件地址在 ASP.NET Core Identity 中通常是唯一的。所以用户不可能有两个具有相同用户名和电子邮件地址的不同用户。
如果您希望您的多租户基于这样一个事实,即您可以使用单个 username/email 注册到多个租户但具有单独的身份,那么这不适用于默认设置。