10

(SimpleMembershipを介して)フォーム認証を使用するASP.NET MVCアプリで、ユーザー/アカウントを削除するにはどうすればよいですか?

WebSecurityクラスはDeleteUserを公開しません。ひばりで、私は試しました:

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

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

しかし、それは私がSimpleMembershipプロバイダーを初期化していないことを不平を言います。いずれにせよ、ユーザーを削除する方法を示すサンプルコードをいただければ幸いです。ありがとう!

ボブ

4

5 に答える 5

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);
    }
}
于 2013-02-27T13:41:14.793 に答える
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);
        }
    }
于 2012-11-24T17:58:14.300 に答える
7

を実行するとどうなりますかMembership.DeleteUser(username,true)。に using ディレクティブを追加するための小さなプロンプトが表示される場合がありますMembership。適切に構成されている場合は、新しい SimpleMembershipProvider インスタンスを作成する必要はありません。

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

あなたのプロバイダーには、ここで議論され解決されているこのバグがあります:Membership.DeleteUserは、ユーザーの関連するすべての行を削除していません

于 2012-11-15T03:37:27.030 に答える
1

単体テストを実行しているときに、Membership.DeleteUser から例外System.NotSupportedExceptionが発生していました。問題は、app.config で "DefaultProvider" が "ClientAuthenticationMembershipProvider" に設定されていたことでした。ここでわかるように、これは "このクラスでは使用されていません" です。

修正は、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>
于 2013-04-23T23:45:10.793 に答える
0

私は同じ問題を抱えていたので、PussInBoots の例に従った後に ObjectContext 状態の問題に遭遇した人のためにこれを投稿したかっただけです...

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

context.Users.Remove(user);

それよりも:

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

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

于 2013-04-01T22:30:58.843 に答える