Используя ASP.NET SQL Membership Provider, как мне сохранить свои данные для каждого пользователя? - PullRequest
5 голосов
/ 27 марта 2010

Я использую ASP.NET SQL Membership Provider. Итак, есть таблица aspnet_Users, в которой есть данные о каждом из моих пользователей. (На самом деле, таблица aspnet_Membership содержит большую часть фактических данных).

Теперь я хочу сохранить некоторую информацию о пользователях в моей базе данных, поэтому я решил создать новую таблицу со столбцом UserId (GUID) и отношением FK к aspnet_Users. Однако потом я обнаружил, что не могу легко получить доступ к UserId, поскольку он не предоставляется через API членства. (Я знаю, что могу получить к нему доступ через ProviderUserKey, но похоже, что API абстрагируется от внутреннего UserID в пользу UserName, и я не хочу идти слишком далеко против зерна).

Итак, я подумал, что вместо этого я должен поместить столбец LoweredUserName в мою таблицу и создать отношение FK к aspnet_Users, используя это. Bzzzt. Опять неправильно, потому что хотя в aspnet_Users есть уникальный индекс, который включает в себя LoweredUserName, он также включает в себя ApplicationId - поэтому для создания моих отношений с FK мне нужно иметь столбец ApplicationId в моей таблице тоже.

Сначала я подумал: хорошо, я имею дело только с одним приложением, поэтому я просто добавлю такой столбец и присвоу ему значение по умолчанию. Затем я понял, что ApplicationId - это GUID, поэтому было бы больно это делать. Не сложно точно, но пока я не разверну свою БД, я не могу предсказать, каким будет GUID.

Я чувствую, что что-то упустил, или поступаю неправильно. Что я должен делать?

Ответы [ 4 ]

9 голосов
/ 27 марта 2010

Я думаю, что вы ищете ProfileProvider, который позволит вам связать любую произвольную информацию с пользователем.

Обзор свойств профиля ASP.NET

ДОБАВЛЕНИЕ Если встроенный ProfileProvider не будет соответствовать вашим потребностям, вы можете рассмотреть возможность реализации своего собственного ProfileProvider, написав класс, производный от System.Web.Profile.ProfileProvider. Это позволит вам написать что-то, что позволит избежать проблем сериализации, которые вы упомянули в своем комментарии.

Реализация поставщика профиля

ДОПОЛНЕНИЕ Примечание о SqlMembershipProvider. Вы действительно правы, что классы Membership действительно имеют ключ к имени пользователя, даже если схема имеет ключ к UserId. Откровенно говоря, это одна из моих любимых статей о классах SqlMembershipProvider. Это на самом деле создает проблему в среде с несколькими приложениями, где требуется одно пользовательское хранилище, но независимые списки ролей приложений.

Я бы порекомендовал ввести ключ UserId, поскольку, как вы упомянули, он является первичным ключом таблицы aspnet_Users и используется во всех отношениях внешнего ключа, и он представляет собой одно значение. Если вы введете значение LowerUsername (и ApplicationId), а имя пользователя изменится, вам нужно будет включить каскадное обновление, чтобы это изменение сказалось на ваших пользовательских таблицах.

5 голосов
/ 27 марта 2010

Для этого вы можете реализовать профиль провайдера. Это не очень сложно. В основном вы будете настраивать свои пользовательские настройки, например:

(web.config):

<profile enabled="true" defaultProvider="MyProvider">
    <providers>
        <add name="MyProvider" connectionStringName="MembershipCnnStr" applicationName="MyApp" type="System.Web.Profile.SqlProfileProvider"/>
    </providers>
    <properties>
        <add name="EmployeeId" type="String" />
        <group name="UserSettings">
            <add name="IsSandboxMode" type="Boolean" defaultValue="false" />
            <add name="Shortcuts" type="System.Collections.Generic.List`1[System.string]" />
        </group>
    </properties>
</profile>
3 голосов
/ 27 марта 2010

Если вы смотрите на добавление простых данных, привязанных к вашим пользователям, таких как добавленные свойства профиля, вам следует изучить Персонализация .

Например, если вы хотите сохранить девичью фамилию человека как часть информации его профиля, вы можете сделать это с помощью этой функции.

Вероятно, это не правильный выбор для сложных данных, но это начало.

1 голос
/ 14 октября 2013

Записать файл .cs как

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        FirstNameTextBox.Text = Server.HtmlDecode(Profile.FirstName);
        LastNameTextBox.Text = Server.HtmlDecode(Profile.LastName);

    }

}

и web.config

 <profile>
  <providers>
      <add name="FirstName" type="System.String"/>
      <add name="LastName" type="System.String"/>
      <add name="MemberId" defaultValue="0" type="System.Int32"/>
    <clear/>
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
  </providers>
</profile>
...