使用ASP.NET SQL Membership Provider,如何存储我自己的每用户数据?

时间:2010-03-27 17:02:10

标签: asp.net asp.net-membership

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

我现在想在我的数据库中存储一些每用户信息,所以我想我只是创建一个新表,其中UserId(GUID)列和FK关系为aspnet_Users。但是,我后来发现我无法轻松访问UserId,因为它没有通过成员资格API公开。 (我知道我可以通过ProviderUserKey访问它,但似乎API正在抽象内部UserID,而不是UserName,我也不想这样做远远落后于粮食。)

所以,我认为我应该在我的表中添加LoweredUserName列,并使用它创建与aspnet_Users的FK关系。 Bzzzt。错了,因为虽然aspnet_Users中有一个唯一索引包含 LoweredUserName,但它还包含ApplicationId - 所以为了创建我的FK关系,我也需要在我的表格中有一个ApplicationId列。

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

我觉得我错过了一些东西,或者说错误的方式。我应该做什么?

4 个答案:

答案 0 :(得分:9)

我认为您正在寻找ProfileProvider,让您将您想要的任意信息与用户相关联。

ASP.NET Profile Properties Overview

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

Implementing a Profile Provider

ADDITION 关于SqlMembershipProvider的注意事项。尽管在UserId上键入了模式,但您确实正确使用了成员资格类的用户名。坦率地说,这是我对SqlMembershipProvider类的烦恼之一。这实际上会在多应用程序环境中产生问题,在该环境中您需要单个用户存储,但需要独立的应用程

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

如果您要添加与用户相关的简单数据,例如添加的个人资料属性,则应该查看Personalization

例如,如果您想将某人的母亲的婚前姓名作为其个人资料信息的一部分存储,您可以使用此功能进行保存。

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

答案 3 :(得分:1)

像。

一样写.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>