在SimpleMembershipProvider中需要UniqueEmail

时间:2013-08-03 13:05:33

标签: c# asp.net-mvc

在阅读本网站上的许多博客和帖子之后,我认为尝试在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");
} 

1 个答案:

答案 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" />