使用基于声明的身份验证的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行上发生。因此,我认为必须有另一种方法来正确更新用户名。
答案 0 :(得分:1)
尝试使用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);
}
对于某些属性/列,其行为类似于“只读”,您需要使用SetValue方法,就像它是自定义字段(API示例)
答案 1 :(得分:1)
你需要做一些事情:
检查用户是否已存在:
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
}
我愿意打赌用户名是保留的还是无效的,这就是为什么它没有保存。你所做的任务应该没有问题。
看起来您在全局处理程序中执行此更新,因此这可能会导致一些问题。因此,您可能必须稍后执行该用户名更新,或者只是将记录写入自定义表,然后根据在自定义表中创建这些记录的事件从那里更新它。
所以我通过你的代码进行调试,并通过从全局事件处理程序中删除它来验证它是否正常工作,如果它有效,那么这就是一次发生太多事情的问题。