【问题标题】:Get all user profiles with all custom properties with ASP.NET Membership使用 ASP.NET Membership 获取具有所有自定义属性的所有用户配置文件
【发布时间】:2012-09-19 00:16:44
【问题描述】:

我正在创建一个 MVC4 Web 应用程序,该应用程序使用 ASP.NET 表单身份验证并定义了自定义配置文件属性,例如名字和姓氏。

经过一番争论,这对于注销小部件效果很好:

Hello, 

@((Profile as ProfileCommon).FirstName)

@((Profile as ProfileCommon).LastName)

但现在我需要制作一个管理屏幕,显示(除其他外)所有作者的名字和姓氏,以获取文档列表。

这是为了显示信息网格,因此出于性能原因,我不能为每个用户进行数据库绑定调用。我需要在一两个查询中获取所有信息。

我每行都有作者的会员用户 ID GUID。因此,我需要将所有用户的名字和姓氏从 GUID 中删除。

在查看了有关此主题的其他一些 SO 帖子后,我想出了这个静态方法来获取信息:

public static IEnumerable<UserInfo> GetUserInfos()
{
    var members = Membership.GetAllUsers();

    var profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);

    foreach (MembershipUser member in members)
    {
        var profile = profiles[member.UserName];

        if (profile != null)
        {
            yield return new UserInfo
            {
                UserId = (Guid)member.ProviderUserKey,

                FirstName = profile.???,

                LastName = profile.???
            };
        }
    }
}

我成功地从方法中获取了成员和个人资料。但所有配置文件对象都是 ProfileInfo 对象,而不是 ProfileCommon 或 ProfileBase。他们似乎没有任何方法可以访问自定义属性。

为什么这种技术缺少自定义属性?我怎样才能得到它们?

有更好或更简单的方法吗?

作为参考,相关的 web.config 值:

<authentication mode="Forms">
    <!--<forms name=".ASPXAUTH" protection="None" domain=".napa-ibs.com" path="/" loginUrl="Account/Login" />-->
    <forms name=".ASPXAUTH" protection="None" path="/" loginUrl="Account/Login" />
</authentication>
<roleManager enabled="true">
    <providers>
        <clear/>
        <add
            name="AspNetSqlRoleProvider"
            connectionStringName="AuthenticationDatabase"
            applicationName="IBSRegistration"
            type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    </providers>
</roleManager>
<membership>
    <providers>
        <clear/>
        <add
            name="AspNetSqlMembershipProvider"
            type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
            connectionStringName="AuthenticationDatabase"
            enablePasswordRetrieval="true"
            enablePasswordReset="true"
            requiresQuestionAndAnswer="false"
            applicationName="IBSRegistration"
            requiresUniqueEmail="false"
            passwordFormat="Clear"
            maxInvalidPasswordAttempts="100"
            minRequiredPasswordLength="7"
            minRequiredNonalphanumericCharacters="1"
            passwordAttemptWindow="10"/>
    </providers>
</membership>
<profile enabled="true">
    <providers>
        <clear/>
        <add
            name="AspNetSqlProfileProvider"
            connectionStringName="AuthenticationDatabase"
            applicationName="IBSRegistration"
            type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    </providers>
    <properties>
        <add name="FirstName" type="string"/>
        <add name="LastName" type="string"/>
        <add name="Title" type="string"/>
        <add name="District" type="string"/>
        <add name="DC" type="string"/>
        <add name="Address1" type="string"/>
        <add name="Address2" type="string"/>
        <add name="City" type="string"/>
        <add name="State" type="string"/>
        <add name="ZipCode" type="string"/>
        <add name="IsApproved" type="bool"/>
        <add name="RegistrationDate" type="DateTime"/>
    </properties>
</profile>

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-membership asp.net-authentication


    【解决方案1】:

    您需要获取对 CommonProfile 对象的引用才能访问您的自定义属性。

    public static IEnumerable<UserInfo> GetUserInfos()
    {
        var members = Membership.GetAllUsers();
    
        var profiles = ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All);
    
        foreach (MembershipUser member in members)
        {
            var profile = profiles[member.UserName];
            ProfileCommon profileCommon = Profile.GetProfile(profile.UserName);
    
            if (profileCommon != null)
            {
                yield return new UserInfo
                {
                    UserId = (Guid)member.ProviderUserKey,
    
                    FirstName = profileCommon.FirstName,
    
                    LastName = profileCommon.LastName
                };
            }
        }
    }
    

    【讨论】:

    • 谢谢,我在另一篇文章中看到了 Profile.GetProfile()。我必须启动 SQL 探查器才能确定,但​​我敢打赌,该方法每次都会调用数据库。因此,如果您有一千个用户,您将在循环内对数据库进行一千次调用。所以我认为这不是解决我的问题的可行方法。目前,我已经求助于直接使用实体框架访问身份验证数据库。它不漂亮,但它有效:\
    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2021-06-30
    • 1970-01-01
    • 2013-06-19
    • 2023-03-25
    相关资源
    最近更新 更多