0

MVC3 アプリがあり、サイトにアクセスする前にユーザーを認証する必要があります。私はログインしていて、データを表示している画面にいましたが、去りました。1 時間後に戻ってきましたが、今ではユーザーは自動的にログオフされています。しかし、再度ログインせずにボタンをクリックしてデータを取得すると、オブジェクトが null であるために黄色の死の画面が表示されました。これは私のアクションです:

  [Authorize]
    public ActionResult Index(string id)

[Authorize] 属性は、認証されない限りこのアクションを実行しないようにしていると思いましたが、どうやらそれを正しく使用していないか、使用していないようです。[Authorize] またはその他の属性を使用して、ユーザーが常に認証されていることを確認し、認証されていない場合はログイン画面に移動するにはどうすればよいですか? ありがとう

PS これは、タイムアウトが発生した場合にのみ発生します。ログインせずに URL を入力してビューにアクセスしようとすると、期待どおりにログイン画面が表示されます

4

1 に答える 1

4

1時間後に戻ってきましたが、今ではユーザーは自動的にログオフされています

アクションが実行された場合、これはユーザーがログオフしていないことを意味します。[Authorize]属性は期待どおりに機能します。

あなたの問題は認証とは何の関係もないと思います。使用している ASP.NET セッションに関係しています。フォーム認証 Cookie と ASP.NET セッションは 2 つの完全に異なる概念であることに注意してください。したがって、ユーザーがログインしたときに ASP.NET セッションに何かを保存したと思います。ただし、ASP.NET セッションはデフォルトで 20 分で期限切れになり、フォーム認証 Cookie タイムアウトとは無関係に構成されます。したがって、ユーザー認証 Cookie がまだ有効であり、ユーザーが認証されている間は、セッションが期限切れになったか、Web サーバーが単にアプリケーションをリサイクルし、セッションに保存したすべてが失われたため、セッションが失われました。

これは言われていることですが、この問題を回避するために必要なさまざまな可能性を見てみましょう:

  1. 私の推奨するアプローチは、セッションを取り除くことです。web.config に入力するだけ<sessionState mode="Off" />で、ASP.NET セッションがステートレス アプリケーションに導入するステートフルネスのことは忘れてしまいます。
  2. 認証 Cookie が有効かどうかを確認するだけでなく、セッションにまだ値が含まれているかどうかを確認するカスタムの Authorize 属性を記述します。

    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var authorized = base.AuthorizeCore(httpContext);
            if (!authorized)
            {
                return false;
            }
    
            return httpContext.Session["someKeyThatYouHaveStored"] != null;
        }
    }
    

次に、このカスタム属性を使用します。

[MyAuthorize]
public ActionResult Index(string id)
于 2012-05-31T12:26:49.657 に答える