1

共有認証 Cookie のセットアップで奇妙な動作に気付きました。これが私のシナリオです。

次のようなドメインを持つ 2 つのアプリケーションがあります。

login.mydomain.com system.mydomain.com

ユーザーを login.mydomain.com にリダイレクトし、そこから Cookie を mydomain.com にドロップしています。

system.mydomain.com:

void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (Context.User == null || !Request.IsAuthenticated)
        {
            HttpContext.Current.Response.Redirect("http://login.mydomain.com");
        }
    }

login.mydomain.com

protected void btnSubmit_Click(object sender, EventArgs e)
    {
        pnlLoginNotice.Visible = true;
        if (Membership.ValidateUser(txtUsername.Text, txtPassword.Text))
        {
            HttpCookie cookie = FormsAuthentication.GetAuthCookie(txtUsername.Text, chkRememberMe.Checked);
            cookie.Domain = "mydomain.com";

            Response.Cookies.Set(cookie);
        }
    }

Web.config:

<authentication mode="Forms" >
  <forms timeout="2880" name=".COMMONAUTH"  />      
</authentication>

現在、私が見ている動作は、.COMMONAUTH Cookie が system.mydomain.com の下にドロップされているのを見つけることですが、mydomain.com の下には同じ Cookie があります。サイトでしばらく非アクティブになった後に表示されることに気付きました。

フォーム認証を維持するために、asp.netが独自にCookieをドロップしている可能性はありますか?

更新 次のアプローチを試しました

1:

system.mydomain.com Web.config

<authentication mode="Forms" >
  <forms timeout="1" name=".COMMONAUTH" />      
</authentication>

login.mydomain.com Web.config

<authentication mode="Forms" >
  <forms timeout="2"  name=".COMMONAUTH"/>
</authentication>

1 分経過後に system.mydomain.com のページを更新すると、system.mydomain.com の下に .COMMONAUTH Cookie が表示されます

2:

system.mydomain.com Web.config

<authentication mode="Forms" >
  <forms timeout="2" name=".COMMONAUTH"  />      
</authentication>

login.mydomain.com Web.config

<authentication mode="Forms" >
  <forms timeout="1"  name=".COMMONAUTH"/>
</authentication>

1 分経過後に system.mydomain.com のページを更新すると、ログアウトされます。

3:

system.mydomain.com Web.config

<authentication mode="Forms" >
  <forms timeout="1" name=".COMMONAUTH" domain="mydomain.com" />      
</authentication>

login.mydomain.com Web.config

<authentication mode="Forms" >
  <forms timeout="2"  name=".COMMONAUTH" domain="mydomain.com"/>
</authentication>

1 分が経過した後に system.mydomain.com のページを更新すると、すべて同じままで、まだ認証されています。3 番目のアプリケーションがこのセットアップに導入されたときに何が起こるかはわかりません

結論

私の問題は、web.config でドメインを設定していないことが原因だと思うので、system.mydomain.com は Cookie を更新しようとしていますが、どこでそれを行うべきかを伝えていないため、独自のドメインを使用しています。

私の問題は、これらのアプリケーションが異なるドメイン バインディングを持ち、複数のクライアントに対して 1 回ホストされることです。FormsAuthentication.CookieDomain は読み取り専用なので設定できません。

オプション 2 を使用して、Cookie 発行者に他のアプリケーションからのタイムアウトを短くする必要がありますか? これには何らかの影響がありますか?

4

2 に答える 2

2

私はこれをやり遂げました。誰かが問題を指摘した場合に備えて、これを答えとしてまだマークしません。

Global.asax で

void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (Context.User == null || !Request.IsAuthenticated)
        {
            HttpContext.Current.Response.Redirect(GetLoginUrl());
        }
        else if (Context.User.Identity is FormsIdentity)
        {
            HttpCookie cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];

            if (cookie != null)
            {
                FormsAuthenticationTicket currentTicket = FormsAuthentication.Decrypt(cookie.Value);


                if (currentTicket == null && currentTicket.Expired)
                {
                    return;
                }
                FormsAuthenticationTicket newTicket = currentTicket;
                if (FormsAuthentication.SlidingExpiration)
                {
                    FormsIdentity id = (FormsIdentity)Context.User.Identity;
                    newTicket = FormsAuthentication.RenewTicketIfOld(id.Ticket);
                }

                if (currentTicket != newTicket)
                {
                    cookie.Value = FormsAuthentication.Encrypt(newTicket);
                    cookie.Expires = newTicket.Expiration;
                    cookie.Domain = WebGlobal.GetCurrentContextDomain();

                    Response.Cookies.Set(cookie);
                }
            }
        }
    }
于 2013-02-12T11:43:27.790 に答える
1

提供した情報を使用して、Application_Startの構成を動的に変更し、ドメイン属性がまだ設定されていない場合は正しい値を設定するオプションもあります。

見る :

http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28System.Configuration.ConfigurationManager%29;k%28TargetFrameworkMoniker-.NETFramework

これがお役に立てば幸いです


フォーム要素のtimeout属性の説明にヒントがあると思います。

http://msdn.microsoft.com/en-us/library/1d3t3c61%28v=vs.80%29.aspx

パフォーマンスの低下を防ぎ、Cookieの警告がオンになっているユーザーに対する複数のブラウザーの警告を回避するために、指定された時間の半分以上が経過するとCookieが更新されます。これにより、精度が低下する可能性があります。デフォルトは「30」(30分)です。

system.mydomain.comでも2880分に設定されていますか?それともデフォルトの30分の値ですか?その場合、15分後にCookieの変更が表示されます。


このように設定しても問題は発生しますweb.configか?

<authentication mode="Forms" >
  <forms timeout="2880" name=".COMMONAUTH" domain=".mydomain.com" />      
</authentication>
于 2013-02-08T12:44:21.840 に答える