Kentico 10 - 如何更新现有用户的用户名?

Kentico 10 - How do I update the username of an existing user?

使用具有基于声明的身份验证的 kentico 10 网站。我们可以在外部系统中更新他们的电子邮件地址。所以我想做的是根据我们的 sso 平台的外部用户 ID 查找来更新用户的电子邮件地址和用户名。

var existingUser = UserInfoProvider.GetUsers().Where("ExternalGuid", QueryOperator.Equals, userId).FirstOrDefault();

if (existingUser.IsInSite(SiteContext.CurrentSiteName))
    UserInfoProvider.RemoveUserFromSite(existingUser.UserName, SiteContext.CurrentSiteName);

loggingInUser = UserInfoProvider.GetUserInfo(existingUser.UserID);
loggingInUser.UserName = e.UserName;

UserInfoProvider.SetUserInfo(loggingInUser);

我收到错误: 代号为 'ac.aa@test.com' 的用户已经存在。

这是在 SetUserInfo 行上发生的。所以我想必须有另一种方法来正确更新用户名。

尝试使用 SetValue(string columnName, value) 方法,我刚刚测试了这个并且它工作正常:

UserInfo updateUser = UserInfoProvider.GetUserInfo("NewUser");
    if (updateUser != null)
    {
        // Updates the user's properties
        updateUser.SetValue("UserName", "NewUserName");

        // Saves the changes to the database
        UserInfoProvider.SetUserInfo(updateUser);
    }

对于某些表现类似于 "read only" 的 properties/columns,您需要像使用自定义字段一样使用 SetValue 方法(API 示例)

您需要做几件事:

检查用户是否已经存在:

UserInfo ui = UserInfoProvider.GetUserInfo(newUserName);
if (ui != null)
{
  // user exists with new username so don't continue
}

检查用户名是否可以用作用户名(无空格、特殊字符等):

if (!ValidationHelper.IsUserName(newUserName))
{
  // username cannot be used as a username
}

检查用户名是否保留:

if (UserInfoProvider.NameIsReserved(siteName, newUserName))
{
  // reserved username so cannot use it
}

我敢打赌用户名已保留或无效,这就是它未保存的原因。您完成的作业应该可以正常工作。

您似乎也在全局处理程序中执行此更新,因此这可能会导致一些问题。因此,您可能必须稍后执行该用户名更新,或者只需将记录写入自定义 table,然后根据在自定义 table 中创建这些记录的事件从那里更新它。

所以我会调试你的代码并通过将它从全局事件处理程序中删除来验证它是否正常工作,如果它有效,那么这是一次发生太多事情的问题。