Отображаемое имя FBA с настраиваемым поставщиком членства, WSS 3.0

У меня есть сайт WSS 3.0 (без MOSS), который использует поставщика членства для аутентификации с помощью пользовательских форм и диспетчер ролей, аутентифицирующий пользователей с помощью удаленной веб-службы (хотя на данный момент он работает с данными moq). Моя проблема заключается в следующем: пользователи при входе в систему отображают свое имя как имя для входа, а не полное имя.

Я настроил своего провайдера так, чтобы сохранялись и имя пользователя, и полное имя, и что при запросе (например, GetUserByUsername) любое значение возвращало объект MembershipUser с полным именем в качестве имени пользователя. Это приводит к тому, что в средстве выбора людей sharepoint ввод имени пользователя приводит к автоматическому завершению, превращающему его в его полное имя, как это делает стандартная проверка подлинности Windows.

Однако при установлении точки останова поставщика при входе на сайт вызывается только метод ValidateUser поставщика, они никогда не являются запросом для моих подделанных объектов MembershipUser. При просмотре таблицы UserInfo в базе данных контента создается новая запись с именем пользователя (tp_title), установленным на его имя для входа.

Если не выполнять прямой запрос к базе данных (чего я не собираюсь делать), я не уверен, как я могу иметь удобное имя пользователя для пользовательских пользователей FBA. Помощь будет оценена.


person Aquinas    schedule 14.12.2009    source источник


Ответы (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 в вышеупомянутом.

person Aquinas    schedule 14.12.2009
comment
Я делаю тот же шаг при добавлении пользователя в SharePoint. - person Kusek; 14.12.2009

Я много пытался заставить приведенный выше код работать во время ValidateUser, и я считаю, что это отличное время для обновления UserInfo.tp_Title (за исключением, может быть, того факта, что вы собираетесь обновлять его каждый раз, когда пользователь входит в систему, но, эй, какие? ты собираешься делать?).

Однако мне не удалось заставить EnsureUser работать (тоже пробовал AllUsers[]) без ошибок. Пытался выполнить в анонимном делегате под SPSecurity.RunWithElevatedPrivileges и так далее. Никаких кубиков.

Дело в том, что я думаю, что это совершенно правильная идея, и я просто хочу поделиться тем, как я добился ее работы, путем вызова SP UserGroup веб-службы (/_vti_bin/usergroup.asmx), вызывая UpdateUserInfo. Точная сигнатура метода для меня выглядит примерно так:

UserGroup.UpdateUserInfo("custommembershipprovidername:" + username, TheFullName,
 emailAddress, string.Empty)
person Todd Sprang    schedule 23.12.2009