我有一个WSS 3.0站点(没有MOSS),它使用自定义表单身份验证成员资格提供程序和角色管理器,根据远程Web服务对用户进行身份验证(尽管目前它对moq数据起作用)。我的问题是这样的:用户登录后的名字显示为他们的登录名,而不是他们的全名。
我设置了我的提供程序,以便存储用户名和全名,并且当被询问时(例如GetUserByUsername),任一值都将返回一个MembershipUser对象,其中Fullname作为用户名。这样做的结果是,在sharepoint人员选择器中,输入用户名称会导致自动完成将其变为全名,就像标准的Windows身份验证一样。
但是,对提供程序进行破坏,当登录到站点时,只调用提供程序上的ValidateUser方法,它们永远不会是我的doctored MembershipUser对象的请求。查看内容数据库中的UserInfo表,将创建一个新条目,并将用户名(tp_title)设置为其登录名。
没有对数据库运行直接查询(我不打算这样做)我不确定如何为自定义FBA用户提供用户友好的用户名。帮助将不胜感激。
答案 0 :(得分:2)
没关系,找到了解决方法。在我的自定义成员资格提供程序的验证用户方法上,以下代码允许我设置name属性。当使用数千个用户时,这可能无法扩展,但对于小型用户群,它应该没问题:
public override bool ValidateUser(string username, string password)
{
if (moqUsers.Any(user => user.Username.Equals(username) && user.Password.Equals(password)))
{
SPContext.Current.Site.RootWeb.AllowUnsafeUpdates = true;
var user = SPContext.Current.Site.RootWeb.EnsureUser(username);
user.Name = RetrieveUserFullName(username);
user.Update();
SPContext.Current.Site.RootWeb.AllowUnsafeUpdates = false;
return true;
}
return false;
}
此外,上面可能需要很好地处理rootweb。
答案 1 :(得分:0)
我在ValidateUser
期间尝试了很多让上面的代码工作,我认为这是更新UserInfo.tp_Title
的好时机(除非您每次都要更新它)用户登录的时间,但是,嘿,你打算做什么?)。
但是,我无法让EnsureUser
运行(也尝试过AllUsers[]
)而不会抛出错误。试图在SPSecurity.RunWithElevatedPrivileges
下的匿名代表和所有人中执行。没有骰子。
SP UserGroup
网络服务(/_vti_bin/usergroup.asmx
),调用UpdateUserInfo
。我的确切方法签名如下所示:
UserGroup.UpdateUserInfo("custommembershipprovidername:" + username, TheFullName,
emailAddress, string.Empty)