在阅读本网站上的许多博客和帖子之后,我认为尝试在SimpleMembershipProvider中覆盖RequiresUniqueEmail似乎只是一个很简单的代码。
所以我正在寻找一些关于我所做的事情的建议。我在数据库的电子邮件列中添加了一个唯一索引,然后我有一个try catch块来捕获任何sql异常。
我查看了用户发布的电子邮件地址的异常消息,如果我找到它,则返回一条消息“已经在使用电子邮件”,否则返回另一条消息。
这适用于我的机器,我收到的错误信息是:
Message=Cannot insert duplicate key row in object 'dbo.UserProfile'
with unique index 'idx_UniqueEmail'. The duplicate key value is
(myemail@test.com).
由于我不是一位经验丰富的程序员,所以我们将不胜感激。
我的代码如下。
catch (SqlException e)
{
var errorMessage = e.Message.ToLower();
ModelState.AddModelError("", errorMessage.Contains(model.Email) ? "Sorry the email address is already in use." : "Sorry an error has occured");
}
答案 0 :(得分:0)
SimpleMembershipProvider不支持电子邮件。它实际上没有电子邮件的概念,如果你看一下默认的自动生成的模式,你会注意到它。这就是SimpleMembershipProvider实现不支持许多遗留MembershipProvider API的原因。
您当然可以在UserProfile表中添加一个电子邮件列(我假设您已经完成),但提供程序没有实现RequiresUniqueEmail的机制,实际上是硬连线,总是返回false。添加数据库约束在某种程度上可以起作用,但只能在更新配置文件时引发异常。它并不优雅,但应该有效。
您可以告诉SimpleMembershipProvider在初始化提供程序时使用电子邮件作为用户名,但这意味着丢失userName字段并要求用户使用电子邮件/密码登录,这可能不是首选。
WebSecurity.InitializeDatabaseConnection(connectionString, "UserProfile", "UserId", "Email", true);
另一种方法是扩展SimpleMembershipProvider,使其具有电子邮件感知能力,并实现RequiresUniqueEmail。
在GutHub上查看BetterMembership.Net,它就是这样,可以用作SimpleMembershipProvider的替代品。电子邮件列在提供程序上指定,它支持RequiresUniqueEmail开箱即用。
<add name="BetterProvider"
type="BetterMembership.Web.BetterMembershipProvider, BetterMembership, Version=1.0.1.0, Culture=neutral, PublicKeyToken=737bc70442f2c4af"
connectionStringName="DefaultConnection"
userIdColumn="UserId"
userNameColumn="UserName"
userTableName="UserProfile"
userEmailColumn="Email"
requiresUniqueEmail="true"
autoInitialize="true" />