0

mvc 3 アプリで Windows 認証を使用していますが、通常はすべて正常に動作します。ただし、特定のページを約 2 分間開いたままにし、ajax 要求を行うと、(コントローラー内の) User.Identity.Name は空白を返し、authenticationtype も同様です。これにより、user.isinrole(whatever) をチェックするとエラーが発生します。通常、キャッシュをクリアすると問題は解決しますが、定期的に更新することはできません。キャッシュを数回クリアする必要がある場合があります。

私はクロムを使用していますが、IEで試したときにバグに気づきませんでした(クロムでかかる時間よりも長く待っていませんでした)ので、バグがクロムに​​ある可能性はありますか? 編集:Firefoxでも発生します。

失敗するまでの時間が、Windows 認証で User.Identity.Name が空白になることがあるという問題に似ていることに気付きましたが 、web.config で匿名認証について何も表示されませんでした。

in user.identity.name がしばらくすると空白になり、IIS サーバーで匿名認証が有効になっていることが問題のようでした。私もそれを持っていますが、サーバーに設定したかったのです。匿名でアクセスする必要がある特定のページがあるため、認証はすべてサーバーではなく MVC によって実施されるため、IIS では匿名認証と Windows 認証が有効になっています。

system.web タグに authentication mode="Windows" があり、web.config の認証については何もありません。global.asax.cs の registerglobals 関数では、

filters.Add(new RequireWindowsAuth());

これは AuthorizeAttribute から継承するクラスであり、OnAuthorization メソッドをオーバーライドして次のようなことを行います。

if(!User.IsInRole("Admin") && AdminAttr is defined)
     filterContext.Result = new HttpStatusCodeResult(403, "You are not authorized to view this page");
else if(AllowAnonymousAttribute is not found)
    base.OnAuthorization(filterContext);

エラーが発生すると、サーバーから正確な 403 応答が返されます。

要求されたアクションには admin 属性があり、allowanonymous 属性は定義されていません

定義されている属性を確認する方法は次のとおりです

filterContext.ActionDescriptor.IsDefined(attr, true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AdminAttribute), true)
4

1 に答える 1

1

Fiddlerを起動して MVC アプリとブラウザーの間に接続し、ブラウザー サーバーとの間でやり取りされるすべての情報を監視します。

  1. アプリプールが再起動され、認証されたすべての人を忘れてしまいますか?
  2. なんらかの理由でセキュリティがタイムアウトし、セキュリティ cookie が期限切れ (または失われる) ですか?
  3. セッションがリセットされていないことを確認します (Session_Start および Session_End グローバル イベントを使用し、これをどこかに記録します)。

Fiddler では、クライアントを削除できる必要があります。これは必須です。コンポーネントが多すぎる問題をデバッグしています。使用しているブラウザがクリーンで完全なデータを渡していることを確認する必要があります。ブラウザまたはサーバーのいずれかを問題から取り除きます。

私の直感では、サーバーの問題が原因で、サーバーが認証されたユーザー (Session_End、Application_End を使用して検出可能) を忘れているか、AJAX が何らかの形で必要な情報を送信していないことがわかります。認証クッキーは生きています。Fiddler は、2 つのうちのどちらであるかを判断するのに役立ちます。

おまけに、Fiddler を使用すると、セッションを再生できます。これにより、エラーを再現できます。ブラウザーなしで Fiddler 内でエラーが発生した場合は、問題がサーバーにあることがわかります。それ以外の場合は、ブラウザー/ajax です。

お役に立てれば、

于 2012-10-29T15:58:30.180 に答える