【问题标题】:Custom UserValidator Affects Newly Created User Added to a Role自定义 UserValidator 影响添加到角色的新创建用户
【发布时间】:2019-09-19 06:33:59
【问题描述】:

我正在尝试在 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 的错误:“指定的用户名和电子邮件已在给定租户中注册”。

我不知道为什么在尝试将已创建的用户添加到角色时它会返回验证器。我认为它只是在创建用户时才被调用。因此,我无法将用户添加到角色。我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    身份用户在更新时被验证,而不仅仅是在创建时。这是为了确保用户始终保持有效。

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

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

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

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

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

    【讨论】:

    • 感谢您的洞察力。我没有想到它应该适用于更新。我为自己没有弄清楚这一点而感到尴尬。但是对于您关于多租户的观点,我只是包含了用户名,以确保我们每个租户都有唯一的用户。但我明白你的意思。
    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2013-09-29
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2014-08-08
    相关资源
    最近更新 更多