如何在表用户没有 ID 时创建自定义简单成员资格提供程序



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

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

正如您在这里看到的,我尝试在数据库中使用User表。对于InitializeDatabaseConnection功能:

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

此函数要求User表有一个id列。但就我而言。我使用Username列作为主键,所以我没有id列。

我的问题是,如果我没有id列,我应该向第三个参数传递什么?不允许传递null或空字符串,并且将引发异常。我该怎么办?

非常感谢你的帮助。

简短回答-

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

引发异常的原因是,SimpleMembershipProvider在内部使用UserId列,并且假定该列不为null。

更多细节-

现在需要更多的细节来帮助你理解为什么这样-

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表的两列视为保留供内部使用。任何自定义应用程序逻辑都可以通过添加更多列来构建。

最新更新