2012-11-15 6 views
10

フォーム認証(SimpleMembership経由)を使用している私のASP.NET MVCアプリケーションでは、どのようにユーザー/アカウントを削除できますか?SimpleMembershipユーザーを削除するには?

WebSecurityクラスはDeleteUserを公開しません。ヒバリでは、私が試した:

WebSecurity.InitializeDatabaseConnection(
    "MyDbConnection", "Users", "Id", "UserName", autoCreateTables: true); 

new SimpleMembershipProvider().DeleteUser(userName, true); 

が、それは私がSimpleMembershipプロバイダを初期化していないと文句を言い。いずれにしても、ユーザーを削除する方法を示すサンプルコードがありがたいです。ありがとう!あなただけMembership.DeleteUser(username,true)を行うとどうなりますか

ボブ

答えて

7

Membershipにusingディレクティブを追加するためのプロンプトが少し表示されることがあります。正しく構成されている場合は、新しいSimpleMembershipProviderインスタンスを作成する必要はありません。

そのように作成する場合は、そのオブジェクトに接続を設定し、プログラムで設定する必要があります(上で作成した接続についてのヒントはありません)。通常、web.configではこれを行いますが、フォーム認証テンプレートを使用してアプリケーションを作成した場合は、自動的にそれを処理する必要があります。

あなたのプロバイダが議論され、ここで解決されたこのバグ持っている私の

Membership.DeleteUser is not deleting all related rows of the user

+0

それはNotSupportedExceptionをスロー:指定されたメソッドがサポートされていません。 –

+0

私はNotSupportedExceptionが何であるかについてはわかりません。私はおそらくSimpleMembership claptrapを正しく初期化していなかったでしょう。多くの試行錯誤の末、私は幸いなことにコードネーム移行とシンプルメンバーシップのすべてを手に入れたと思います。メンバーシップ・デイ・ユーユーザーはうれしく働きます。 –

+1

Bob.at.SBS下の私のコメントを参照してください、これはクラスがそのメソッドを実装していないプロバイダを打つことを意味します。 – ProVega

9

あなたは、おそらくこのような何か必要があります。これは、常に外部キー制約をスローしますが、

// 
    // GET: /Members/Delete?userName=someuser 

    public ActionResult Delete(string userName) 
    { 
     var user = context.UserProfiles.SingleOrDefault(u => u.UserName == userName); 
     return View(user); 
    } 

    // 
    // POST: /Members/Delete?userName=someuser 

    [HttpPost] 
    public ActionResult Delete(string userName, FormCollection collection) 
    { 
     try 
     { 
      // TODO: Add delete logic here 
      ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table 
      ((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(userName); 
     } 
    } 
+0

osiris97の回答は、ロールの取り扱いにより完全です。それを確認してください。 – PussInBoots

39

PussInBootsは、絶対的に正しいです削除されたユーザーが任意のロールに追加された場合は私の違反です。私は、これはPussInBoots'によって推定されたと確信している 『// TODO:ここに削除ロジックを追加』のコメントを、私は通常、最初にこのような役割のメンバーシップをクリーンアップします。

[HttpPost] 
public ActionResult Delete(string userName, FormCollection collection) 
{ 
    try 
    { 
     // TODO: Add delete logic here 
     if (Roles.GetRolesForUser(userName).Count() > 0) 
     { 
      Roles.RemoveUserFromRoles(userName, Roles.GetRolesForUser(userName)); 
     } 
     ((SimpleMembershipProvider)Membership.Provider).DeleteAccount(userName); // deletes record from webpages_Membership table 
     ((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); // deletes record from UserProfile table 

     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(userName); 
    } 
} 
+0

制約違反に遭遇していないので、さらに優れた追加ができました。 「TODO:Add delete logic here」コメントは、Visual Studioで作成したデフォルトのMVCアプリケーションによって自動的に生成されました。 – PussInBoots

+1

優れたソリューション。これは受け入れられた答えでなければなりません。 @ Gauiは同意します。 – Gaui

+0

非常に素晴らしいソリューションありがとうosiris97 –

0

をちょっとだけ実行している人のためにこれを投稿したいですPussInBootsの例を以下の後のObjectContext状態の問題に、私は同じ問題を抱えていたので...

追加のユーザーデータにアクセスしている場合は、使用してデータコンテキストからそのユーザーを削除する必要があります。

むしろ
context.Users.Remove(user); 

をより:

((SimpleMembershipProvider)Membership.Provider).DeleteUser(userName, true); 

これにより、EFコンテキストを最新の状態に保ち、ユーザーをDBから削除します。

1

ユニットテストを実行しているときに、私は例外System.NotSupportedExceptionをMembership.DeleteUserから取得していました。問題は、app.configに「DefaultProvider」が「ClientAuthenticationMembershipProvider」に設定されていたことです。hereが「このクラスでは使用されていません」と表示されています。

修正は私のweb.configファイルにマッチし、適切に既定のプロバイダを設定するには、私のapp.configをを更新しました:

<membership> 
    <providers> 
     <clear /> 
      <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="Crelate.Properties.Settings.DatabaseMembershipServicesConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
     </providers> 
    </membership> 
関連する問題