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