1

この Web サイトで多くのブログや投稿を読んだ後、SimpleMembershipProvider で RequiresUniqueEmail をオーバーライドしようとすることは、些細なことのための多くのコードのように思えます。

だから私は私がやったことについていくつかのアドバイスを探しています。データベースのメール列に一意のインデックスを追加し、SQL 例外をキャッチする try catch ブロックを作成しました。

ユーザーが投稿した電子メールアドレスの例外メッセージの中を調べて、それが見つかった場合は「電子メールは既に使用されています」というメッセージを返し、それ以外の場合は別のメッセージを返します。

これは私のマシンで機能し、受け取るエラーメッセージは次のとおりです。

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 は電子メールに対応していません。デフォルトの自動生成されたスキーマを見ればわかるように、文字通り電子メールの概念がありません。これが、従来の MembershipProvider API の多くが SimpleMembershipProvider 実装でサポートされていない理由です。

もちろん、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" />
于 2013-10-03T21:47:11.197 に答える