1

底线在前面

对于每个用户映射到 aspnet_Applications 表中指定的每个应用程序,我是否应该在 aspnet_Users 中看到多个用户记录?

情况

我有一个使用 ASP.NET 表单安全性的 Web 应用程序。创建了许多用户后,我决定查看指定为我的提供者的 AspApplicationServices 数据库。在 aspnet_Applications 表中有两个应用程序记录(“/”和“/MyAppNameHere”),每个记录都有其唯一的应用程序 ID。

在 aspnet_Users 表中,我注意到我的用户数是预期的两倍。两个应用程序各一个(即每个用户都有一条记录,指定“/”和“/MyAppNameHere”应用程序记录的ID)。

这是它应该工作的方式吗?我环顾四周并没有发现任何提及此活动,或者它是否是设计的以及它可能用于什么。如果是设计使然,我必须得出结论,用户信息的任何更改都将传播到所有匹配的用户记录,而不仅仅是“根”或其他。

注意:这些用户是通过应用程序(使用 Membership.Create())和配置小应用程序(Security->Create User)创建的。

网络配置

<roleManager enabled="true">
  <providers>
    <clear />
    <add applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices"  />
    <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" />
  </providers>
</roleManager>
4

3 回答 3

2

原因是您的成员资格提供程序和角色管理器提供程序中有不同的应用程序名称。

您将会员提供商的应用程序名称设置为“/MyAppNameHere”。最初,您没有设置角色管理器提供程序的应用程序名称。默认情况下,它使用http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.applicationname.aspx中记录的ApplicationVirtualPath。通常它是您网站的虚拟路径(在许多情况下为“/”)。

因此,当您调用 Membership.CreateUser() 时,它会在 aspnet_users 中创建两条记录。一个用于会员应用程序 ID,一个用于角色提供者的应用程序 ID。这两条记录具有相同的用户名,但具有不同的用户 ID(每个应用程序 ID 一个)。

The call also creates one record in aspnet_membership table (application id, userid, password etc). the Applicatin id and user id are from the record corresponding to the membership provider's application name, i.e., "/MyAppNameHere".

When you create a user role using call such as Roles.AddUserRole(), it will create a record in aspnet_UsersInRoles that uses the user id corresponding to the application id of role manager provider.

I couldn't find official document but http://weblogs.asp.net/gurusarkar/archive/2010/01/09/asp-net-mebership-creates-two-users-in-aspnet-users-table.aspx has some explanation. This diagram helps understand the table relationships.

于 2013-04-25T18:05:57.497 回答
1

RoleProvider您很可能在没有正确配置开箱即用的情况下添加具有角色的用户。

如果您未在 web.config 部分中指定 an ApplicationNameroleManager它将"/"在您尝试创建用户时使用默认应用程序名称创建另一个用户。

<system.web>
    <roleManager enabled="true">
        <providers>
            <clear/>
            <add name="AspNetSqlRoleProvider"
                 connectionStringName="[ConnectionStringName]"
                 applicationName="[ApplicationName]"
                 type="System.Web.Security.SqlRoleProvider" />
        </providers>
    </roleManager>
</system.web>
于 2012-12-26T19:55:47.467 回答
0

在 asawyer 用他的评论发布答案之前,我只会自己标记答案。

看起来多条记录将特定于应用程序的用户联系在一起。创建了一般记录,并创建了与应用程序相关的记录,大概是为了提供应用程序之间的连续性。

于 2012-07-18T18:34:27.487 回答