1

在阅读了该网站上的许多博客和帖子之后,我认为尝试覆盖 SimpleMembershipProvider 中的 RequiresUniqueEmail 似乎只是一个琐碎的代码。

所以我正在寻找一些关于我所做的事情的建议。我在数据库中的 email 列上添加了一个唯一索引,然后我有一个 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");
} 
4

1 回答 1

0

SimpleMembershipProvider 不支持电子邮件。如果您查看默认的自动生成架构,您会注意到它实际上没有电子邮件的概念。这就是 SimpleMembershipProvider 实现不支持许多旧版 MembershipProvider API 的原因。

您当然可以在 UserProfile 表中添加一个 email 列(我假设您已经这样做了),但是提供者没有实现 RequiresUniqueEmail 的机制,并且实际上硬连线始终返回 false。添加数据库约束在一定程度上会起作用,但只能在更新配置文件时引发异常。它一点也不优雅,但应该可以。

您可以告诉 SimpleMembershipProvider 在初始化提供程序时使用电子邮件作为用户名,但这意味着丢失 userName 字段并要求用户使用电子邮件/密码登录,这可能不是可取的。

WebSecurity.InitializeDatabaseConnection(connectionString, "UserProfile", "UserId", "Email", true);

另一种方法是扩展 SimpleMembershipProvider,使其能够识别电子邮件,并实现 RequiresUniqueEmail。

看看GutHub上的 BetterMembership.Net,它确实做到了这一点,并且可以用作 SimpleMembershipProvider 的替代品。email 列在提供程序上指定,它支持 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" />
于 2013-10-03T21:47:11.197 回答