6

.NETMVC4プロジェクトでSimpleMembershipを使用しています。開発中に、データベースを手動で操作/再構築しているときに、本番環境では起こりそうもないエラーに遭遇しましたが、これを解決したいので、適切な処理方法を見つけることができません。

アプリケーションにログインした後、データベースでユーザー名が変更された場合、またはユーザーレコードが完全に削除された場合、ユーザーはアプリケーションのどのページにもアクセスできなくなります...匿名ビューを許可する公開ページを含むログイン画面。代わりに、例外がスローされます-「'us​​ername'という名前のユーザーが見つかりませんでした」。

私のアプリケーションのすべてのページは、ログイン/ログオフコントロールをレンダリングする部分的なビューを表示します。Request.IsAuthenticatedは、データベースの内容に関係なくtrueを返します。アプリは、Cookie内の情報に基づいてユーザーがまだログインしていると見なしているようですが、対応するレコードがデータベースに見つかりません。認証Cookieをクリアするとこれは解決しますが、これは、これを経験している可能性のあるユーザーに提供したい指示ではありません。

私の現在の解決策は、Global.asaxでその例外をキャッチし、Cookieをクリアして、ログインページにリダイレクトすることです。これは私には完全にハッキーに思えます。

誰かがこのシナリオに対するより良い解決策を持っていますか?古い.NETメンバーシッププロバイダーを使用してこのような問題に遭遇したことはありません...この状況は箱から出してすぐにカバーされるべきであり、それを説明する必要はないはずです...レコードが変更された場合DBで/deletedされた場合、ユーザーは認証に失敗し、自動的にログインページにリダイレクトされます。

4

6 に答える 6

2

最初に認証ロジックがどこにあるのかわかりませんが、ここで私がしていることは次のとおりです。

Global.asax.cs で:

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex.Message.Contains("No user found was found that has the name"))
        {
            FormsAuthentication.SignOut();
            Response.Redirect(Request.RawUrl);
        }
    }

スローされた例外は単なる であるためSystem.InvalidOperationException、できることはあまりありません。あまり賢くはありませんが、必要なことは実行します。IsUserInRole(...)また、リダイレクト先のページに のような認証ロジックがないことを確認してください。try{} catch(){}

于 2013-11-04T05:29:17.503 に答える
1

ログイン後、データベースキャッシュまたはページのどこかを確認してください。ユーザーレコードの依存関係、依存している場所、チェーンの削除、または依存性注入が原因で発生している可能性があります。

それを確認するか、コードを共有してください..

于 2012-12-13T08:01:10.573 に答える
0

現在のページにリダイレクトする前にログアウトするように、Arman Bimatov 応答に追加しました。また、現在のページにリダイレクトすることで、returnURL がクエリ文字列に正しく配置されます。

Global.asax.cs で:

protected void Application_Error(オブジェクト送信者、EventArgs e)
    {
      例外 ex = Server.GetLastError();

      if (ex.Message.Contains("その名前のユーザーは見つかりませんでした"))
      {
        FormsAuthentication.SignOut();
        Response.Redirect(Request.RawUrl);
      }
    }

ただし、この質問に従って web.config に CustomerErrors セクションがない限り、これは機能しません: global.asax Application_Error が起動しない

于 2016-07-25T14:16:38.410 に答える
-1

これは、開発環境から別のホストに切り替えるときに発生するようです。localhost はログイン Cookie を記憶しており、それを新しい単純なメンバーシップ データベースに対して使用しようとしています。

あなたが言ったように、それは本番環境では起こりません。申し訳ありませんが、ローカル データベースと運用データベースの両方で同じログインを使用するよりも良い方法がわかりません。

于 2013-02-03T14:17:04.223 に答える