1

I'm having an issue where my session is expiring,

Session["UserId"] = userId;

but the authentication cookie is still there so the [authorize] attribute is still allowing the user to navigate the system until the system tries to read the session variables and errors out. Null exception

Are there any thoughts on how to make the auth cookie go away when the session expires? I would certainly appreciate any insight as I am new to ASP.NET MVC 3.

4

2 に答える 2

2

これは悪い習慣です。詳細な説明については、このリンクを参照してください。基本的に、誰でもログインし、他の誰かのセッション キーを取得すると、その ID を盗むことができます。

代わりに、ユーザーの ID を認証 Cookie に埋め込むことをお勧めします。件名に関するこの質問を参照してください。次に、必要に応じてセッションをキャッシュとして使用することもできます。セッション ID を認証 Cookie に保存されているものと比較するだけです。たとえば、global.asax でこれを行うと、アプリケーションを変更する必要がなくなります。

于 2012-07-10T19:00:52.580 に答える
0

これを行うには多くの方法があります。ここに 1 つのアイデアがあります。

public class ControllerBase : Controller
{
    public ControllerBase()
        : base()
    {
        this.VerifySession();  
    }

    /// <summary>
    /// Indicates whether the session must be active and contain a valid customer.
    /// </summary>
    protected virtual bool RequiresActiveSession
    {
        get { return true; }
    }

    public void VerifySession()
    {
        if (this.RequiresActiveSession && Session["UserId"] == null)
        {
            Response.Redirect(Url.Action("LoginPage"));
        }
    }

}

public class HomeController : ControllerBase
{
    protected override bool RequiresActiveSession
    {
        get
        {
            return true;
        }
    }

    public ActionResult Index()
    {
        return View();
    }
}

基本的に、セッションの検証を処理するコントローラーベースがあります。また、それを継承するコントローラーは、セッションを検証するかどうかを指定できます。

また

コントローラーまたはアクションに属性を付け、コントローラー アクションを実行する前にコードを処理パイプラインにフックできるカスタムアクション フィルターを作成できます。

于 2012-07-10T18:56:19.510 に答える