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

Gar*_*ill 5 asp.net asp.net-membership

我正在使用ASP.NET SQL成员资格提供程序.所以,有一个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将会是什么.

我觉得我错过了一些东西,或者说错误的方式.那我应该怎么办?

Tho*_*mas 9

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

ASP.NET配置文件属性概述

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

实施配置文件提供程序

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

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


Gab*_*ams 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>
Run Code Online (Sandbox Code Playgroud)