【问题标题】:Using ASP.NET SQL Membership Provider, how do I store my own per-user data?使用 ASP.NET SQL Membership Provider,我如何存储我自己的每用户数据?
【发布时间】:2010-03-27 17:02:10
【问题描述】:

我正在使用 ASP.NET SQL 成员资格提供程序。所以,有一个aspnet_Users 表,其中包含我的每个用户的详细信息。 (实际上,aspnet_Membership 表似乎包含了大部分实际数据)。

我现在想在我的数据库中存储一些每个用户的信息,所以我想我只需创建一个新表,其中包含 UserId (GUID) 列和与 aspnet_Users 的 FK 关系。但是,我随后发现我无法轻松访问UserId,因为它没有通过会员 API 公开。 (我知道我可以通过ProviderUserKey 访问它,但似乎API 正在抽象出内部UserID 以支持UserName,我不想太过分了)。

所以,我想我应该在我的表中放置一个 LoweredUserName 列,并使用它创建与 aspnet_Users 的 FK 关系。嗡嗡声。又错了,因为虽然aspnet_Users 中有一个唯一索引包括 LoweredUserName,但它还包括ApplicationId - 所以为了创建我的 FK 关系,我需要我的表中也有一个ApplicationId 列。

起初我想:好吧,我只处理一个应用程序,所以我将添加这样一个列并给它一个默认值。然后我意识到ApplicationId 是一个GUID,所以这样做会很痛苦。不完全,但在我推出我的数据库之前,我无法预测 GUID 将是什么。

我觉得我错过了什么,或者以错误的方式处理事情。我应该做什么?

【问题讨论】:

    标签: asp.net asp.net-membership


    【解决方案1】:

    如果您正在考虑添加与用户相关的简单数据,例如添加的配置文件属性,您应该查看Personalization

    例如,如果您想将某人母亲的娘家姓作为其个人资料信息的一部分,您可以使用此功能来做到这一点。

    这可能不是复杂数据的正确选择,但它是一个开始。

    【讨论】:

    • 你们都同时回复了有效的回复,所以+1。
    • 我应该在一开始就说我确实有一大堆现有的数据库表,我需要能够将我的(复杂的)用户数据存储在一个可以加入的表中。因此,Profiles 并不适合。为您的(适当的)警告+1。
    【解决方案2】:

    像这样写.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>
    

    【讨论】:

      【解决方案3】:

      为此,您可以实现配置文件提供程序。它不是很困难。您将基本上设置您的用户特定设置,如下所示:

      (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>
      

      【讨论】:

      • 请查看我对 Thomas 回答的评论 - 我不想使用配置文件存储,我想使用真正的数据库表。无论如何,谢谢,+1 的细节。
      • 在这种情况下,正如 Thomas 所说,您应该编写自己的自定义提供程序来使用您的数据库。
      【解决方案4】:

      我认为您正在寻找 ProfileProvider,它可以让您将任何您希望的任意信息与用户相关联。

      ASP.NET Profile Properties Overview

      补充 如果内置的 ProfileProvider 不能满足您的需求,那么您可以考虑通过编写一个派生自 System.Web.Profile.ProfileProvider 的类来实现您自己的 ProfileProvider。这将使您能够编写一些内容来避免您在评论中提到的序列化问题。

      Implementing a Profile Provider

      添加关于 SqlMembershipProvider 的注意事项。您确实是正确的,即使架构是在 UserId 上键入的,Membership 类确实是在用户名上键入的。坦率地说,这是我对 SqlMembershipProvider 类的不满之一。这实际上会在多应用程序环境中产生问题,在该环境中您需要单个用户存储但独立的应用程序角色列表。

      我的建议是键入 UserId,因为正如您所提到的,它是 aspnet_Users 表的主键,用于所有外键关系,并且它是单个值。如果您键入 LowerUsername(和 ApplicationId),并且用户名发生更改,则需要启用级联更新,以便更改影响您的自定义表。

      【讨论】:

      • 谢谢,但我认为我需要存储的数据不能以序列化格式保存。我需要与数据库中已有的各种其他表进行连接。我更愿意将我的用户数据放在可以有效运行查询的表中。因此,虽然我可以看到配置文件存储的用途,但它不适合我的情况。无论如何 +1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多