我正在尝试在ASP.NET MVC 4中创建Custom Simple Membership Provider
。在InitializeSimpleMembershipAttribute
类中,我有这行代码:
WebSecurity.InitializeDatabaseConnection("ConnStringForWebSecurity", "User", "", "Username", autoCreateTables: false);
正如您在此处所见,我尝试在数据库中使用User
表。对于InitializeDatabaseConnection
函数:
此函数需要id
表的User
列。但就我而言。我使用Username
列作为主键,因此我没有id
列。
我的问题是,如果我没有id
列,我应该将哪些内容传递给第三个参数?不允许传递null或空字符串,并抛出异常。我该怎么办?
非常感谢你的帮助。
答案 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表的两列保留为内部使用。可以通过添加更多列来构建任何自定义应用程序逻辑。