ASP.NET Membership.CreateUser似乎创建了多个用户记录

时间:2012-06-05 15:34:41

标签: asp.net security

前排底线

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

情况

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

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

这是应该的方式吗?我已经查看并且没有发现这项活动,或者它是否符合设计及其可能性。如果是设计我必须得出结论,用户信息的任何变化都将传播到所有匹配的用户节目,而不仅仅是“根”或另一个。

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

的web.config

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

3 个答案:

答案 0 :(得分:2)

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

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

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

该调用还在aspnet_membership表中创建了一条记录(应用程序ID,用户ID,密码等)。 Applicatin id和user id来自对应于成员资格提供者的应用程序名称的记录,即“/ MyAppNameHere”。

当您使用Roles.AddUserRole()等调用创建用户角色时,它将在aspnet_UsersInRoles中创建一条记录,该记录使用与角色管理器提供程序的应用程序ID相对应的用户ID。

我找不到官方文件,但http://weblogs.asp.net/gurusarkar/archive/2010/01/09/asp-net-mebership-creates-two-users-in-aspnet-users-table.aspx有一些解释。 This diagram有助于理解表关系。

答案 1 :(得分:1)

您最有可能添加具有角色的用户,而无需正确配置开箱即用RoleProvider

如果您未在web.config的ApplicationName部分中指定roleManager,那么当您尝试创建用户时,它将创建另一个具有默认应用程序名称"/"的用户

<system.web>
    <roleManager enabled="true">
        <providers>
            <clear/>
            <add name="AspNetSqlRoleProvider"
                 connectionStringName="[ConnectionStringName]"
                 applicationName="[ApplicationName]"
                 type="System.Web.Security.SqlRoleProvider" />
        </providers>
    </roleManager>
</system.web>

答案 2 :(得分:0)

在asawyer用他的评论发表回答之前,我会自己标记一个答案。

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