当表User没有Id时,如何创建自定义简单成员资格提供程序

时间:2014-02-21 16:53:36

标签: asp.net-mvc-4 membership-provider simplemembership

我正在尝试在ASP.NET MVC 4中创建Custom Simple Membership Provider。在InitializeSimpleMembershipAttribute类中,我有这行代码:

WebSecurity.InitializeDatabaseConnection("ConnStringForWebSecurity", "User", "", "Username", autoCreateTables: false);

正如您在此处所见,我尝试在数据库中使用User表。对于InitializeDatabaseConnection函数:

  • 第一个参数是连接字符串名称。
  • 第二个是表名。
  • 第三个是用户ID列。
  • 第四个是用户名栏。

此函数需要id表的User列。但就我而言。我使用Username列作为主键,因此我没有id列。

我的问题是,如果我没有id列,我应该将哪些内容传递给第三个参数?不允许传递null或空字符串,并抛出异常。我该怎么办?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

简短回答 -

您必须在用户配置文件表中使用int类型的ID列(根据需要命名)。 SimpleMembershipProvider(SMP)在UserProfile表中强制要求两个非空的第一列ID和第二个用户名。这是当你选择从SimpleMembershipProvider派生时,在你的情况下我怀疑你真的需要。如果您有任何自定义需求(SimpleMembershipProvider阻止您实现),则可以从MembershipProvider派生。

引发异常是因为SimpleMembershipProvider在内部使用UserId列,并且假定它不为空。

更详细一点 -

现在有一些细节可以帮助你理解为什么 -

SimpleMembershipProvider旨在提供灵活性,但其主要目标是提供一种更简单的验证用户的方法。它的重点是针对具有常见身份验证需求的80%的Web应用程序。

如果要自定义,例如,您想在UserProfile表中添加自定义列(电子邮件)(表名也是自定义),您可以这样做。 SimpleMembershipProvider只是希望您创建一个数据库,它可以为您创建表,但该表必须有两个必填列(UserID和UserName)。

有关详细信息,请参阅@miller评论中分享的链接。

如果您有任何跟进问题,请通过创建自定义提供商分享您尝试实现的更多详细信息。

编辑(回答问题跟进)

列的名称可以是任何内容(EmployeeId也可以),它将在数据库表中创建为非null int类型。只要您没有调用使用UserId的方法,您的应用程序就会起作用。我想知道你是如何创建一个新用户的。使用新的MVC 4 Web应用程序,当您注册新用户时,WebSecurity会将呼叫转发至SimpleMembershipProvider以创建新用户。 SimpleMembershipProvider的CreateUserRow()方法检查UserID是否存在。如果已存在则抛出异常。创建用户后SimpleMembershipProvider将UserId用于多种公共方法,例如GetUserNameFromId(),GetUser(),DeleteUser(),CreateAccount()等。

Membership使用UserProfile表的方式,恐怕你必须提供UserId列。您也可以使用UserName检索用户,并且根本不会使用UserId。

当您使用SimpleMembershipProvider时,请考虑将UserProfile表的两列保留为内部使用。可以通过添加更多列来构建任何自定义应用程序逻辑。