2012-11-30 15 views
6

.NET MVC4プロジェクトでSimpleMembershipを使用しています。開発中に、手動でデータベースを操作/再構築している間に、私は生産上では起こりそうなエラーに遭遇しましたが、これを解決したいと思います。.NET MVC4 SimpleMembershipエラー - 「xxxという名前のユーザーが見つかりません」

アプリケーションにログインした後、ユーザー名がデータベース内で変更された場合、またはユーザーレコードが完全に削除された場合、ユーザーはアプリケーションの任意のページにアクセスできなくなります。匿名のビュー、およびログイン画面が表示されます。その代わり、例外がスローされます。「ユーザー名が 'username'」のユーザーが見つかりませんでした。

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

私の現在の解決策は、Global.asaxでその例外を捕捉し、クッキーをクリアし、ログインページにリダイレクトすることです。これはちょうど私に完全にハッキーなようです。

このシナリオでは誰かがより良い解決策を得ていますか?私は以前の.NETメンバーシッププロバイダを使用してこのような問題に遭遇したことはありません...私の期待は、この状況がボックスの外からすぐにカバーされるべきだということです。レコードが変更された場合/ DB内で削除された場合、ユーザーは認証に失敗し、自動的にログインページにリダイレクトされるはずです。

答えて

1

ログイン後、依存関係のあるユーザーレコードの依存関係、チェーンの削除、または依存関係注入のために発生している可能性があります。

-1

これはあなたが別のホストに環境をデベロッパーより切り替え時に発生しているようだ...それをチェックしてくださいまたはコードを共有してください。 localhostは、ログインクッキーを覚えていて、それを新しいシンプルメンバーシップデータベースに対して使用しようとしています。

あなたが言ったように、それは生産では起こりません。申し訳ありませんが、ローカルとプロダクションの両方のデータベースで同じログインを使用していない方が良い方法はわかりません。

あなたが最初にあなたの認証ロジックを持っていますが、ここで私が何をすべきかです
+0

は、まあ、私はまだそれを想像します実稼働環境では、データベース内のレコードを手動で削除しないため、発生しない可能性があります。ホストを切り替えるのは問題ではありません。私はこれを克服する方法を見つけようともっと多くの時間を費やしたわけではありませんが、基本的にはデータベース内に存在しなくなったユーザーを参照するブラウザの認証クッキーと関係があります。より優雅に箱から。 – Gadget27

1

わからない: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あるので、そこにされますそれほどあなたはそれでできません。それほどスマートではありませんが、何をする必要がありますか。はい、あなたがしたい、私は私があったIsAuthenticatedtrueを返す、問題の同じ種類を持っていたtry{} catch(){}

1

でそれをラップする可能性がある場合にも、ページ上のあなたにリダイレクトしているIsUserInRole(...)ようには認証ロジックがないことを確認してくださいMVC 4サイトにログインしていないため、同じエラーメッセージが表示されます。 私たちのソリューションでは、SimpleMembershipを持つ2つのMVC 4サイトがあり、2番目のサイトのデバッグ中に最初のサイトにログインしていました。 両方のサイトが別のポート(localhost)にあるので、両方のサイトが同じ認証Cookieを設定するため、Cookieが設定されている必要があります。おそらく、認証クッキーの設定方法を変更する必要があります。

私はあなたに別の問題があるかもしれないと思いますが、おそらく私の "解決策"がこの問題を抱えている人を助けることができます。

+1

このソリューションは私にとってはうまくいって、別のサイトからログインしていました。サイトを切り替えると、このエラーが表示されていました。キャッシュ/クッキーをクリアするだけで正常に動作します。 –

0

オーバーライドAuthorizeAttribute:

public sealed class AuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
    try 
    { 
     return base.IsAuthorized(actionContext); 
    } 
    catch 
    { 
     return false; // user name from cookie is no longer in db 
    } 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
    // handle this exception by global exception filter for redirection to login 
    throw new CustomAuthException(); 
    } 
} 
0

それは、現在のページにリダイレクトする前のあなたをログアウトするように、私はアルマンBimatov応答に追加しました。また、現在のページにリダイレクトすることで、returnURLがクエリ文字列に正しく配置されます。 Global.asax.csで

:あなたはこの質問ごとに、あなたのweb.configファイル内CustomerErrorsセクションを持っていない限り

 
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); 
     } 
    } 

しかし、これは動作しません。 global.asax Application_Error not firing

+0

http://stackoverflow.com/questions/3713939/global-asax-application-error-not-firing –

関連する問題