2

我有一个 WSS 3.0 站点(没有 MOSS),它使用自定义表单身份验证成员身份提供程序和角色管理器,针对远程 Web 服务对用户进行身份验证(尽管目前它适用于 moq 数据)。我的问题是:登录时用户的姓名显示为他们的登录名,而不是他们的全名。

我设置了我的提供程序,以便同时存储用户名和全名,并且当被询问时(例如 GetUserByUsername),任何一个值都将返回一个以全名作为用户名的 MembershipUser 对象。这样做的效果是,在共享点人员选择器中,输入用户用户名会导致自动完成将其转换为他们的全名,就像标准的 windows auth 一样。

但是,对提供程序进行断点,当登录到站点时,仅调用提供程序上的 ValidateUser 方法,它们永远不是对我修改过的 MembershipUser 对象的请求。查看内容数据库中的 UserInfo 表,将创建一个新条目,并将用户名 (tp_title) 设置为他们的登录名。

没有对数据库运行直接查询(我不会这样做),我不确定如何为自定义 FBA 用户提供用户友好的用户名。帮助将不胜感激。

4

2 回答 2

2

没关系,找到了解决办法。在我的自定义成员资格提供程序的 validate user 方法中,以下代码允许我设置 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 进行良好的处理。

于 2009-12-14T04:18:55.827 回答
0

ValidateUser我尝试了很多方法来让上面的代码UserInfo.tp_Title在去做?)。

但是,我无法在不抛出错误的情况下EnsureUser运行(也尝试过)。AllUsers[]尝试在一个匿名委托中执行SPSecurity.RunWithElevatedPrivileges。没有骰子。

不过,事实是,我认为这完全是正确的想法,我只想分享一下我的工作方式是通过调用SP UserGroupWeb 服务 ( /_vti_bin/usergroup.asmx),调用UpdateUserInfo. 对我来说,确切的方法签名看起来像:

UserGroup.UpdateUserInfo("custommembershipprovidername:" + username, TheFullName,
 emailAddress, string.Empty)
于 2009-12-23T18:49:52.790 回答