1

ロードバランサーをテストするために、WindowsAzureで複数のインスタンスを使用してWebRoleをテストています。ユーザーを認証するために必要なコードは次のとおりです。

    protected void Application_AcquireRequestState(Object sender, EventArgs e)
    {
        HttpCookie authCookie = 
            HttpContext.Current.Request.Cookies
               [FormsAuthentication.FormsCookieName];

        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = 
                FormsAuthentication.Decrypt(authCookie.Value);

            SetUserCredentials(authTicket.Name, authTicket.UserData);
        }
    }

    private void SetUserCredentials(string userName, string securityConfig)
    {
        Credentials auth = GetSessionCredentials();

        if (auth == null && HttpContext.Current.Session != null)
        {
            log.DebugFormat("Credentials not available in session variable. Building credentials to __SessionSID.");

            SID sid = 
               AuthenticationHelper.Get().
                  GetAuthenticatedSIDFromName(userName, securityConfig);

            if (sid == null)
            {
                FormsAuthentication.SignOut();
                FormsAuthentication.RedirectToLoginPage();
                return;
            }

            auth = new Credentials(sid);

            if (HttpContext.Current.Session != null)
            {
                log.DebugFormat("Saving credentials in a session variable");
                HttpContext.Current.Session.Add("__SessionSID", auth);
            }
        }

        log.DebugFormat("Time setting user credentials for user: {0} {1}ms", userName, Environment.TickCount - ini);
    }

    private Credentials GetSessionCredentials()
    {
        if (HttpContext.Current == null)
            return null;
        if (HttpContext.Current.Session == null)
            return null;

        return HttpContext.Current.Session["__SessionSID"] as Credentials;
    }

これが私の質問です。Azureで2つのインスタンスを使用してWebRoleをテストしました。

  • ログインしてWebRoleインスタンスAが認証を実行するとします。
  • 新しいリクエストを作成し、そのリクエストがWebRoleインスタンスBに送信されると、Current.Request.Cookiesと のauthTicketは問題ありませんでしたHttpContext.Current.Session["__SessionSID"]

誰かがそれを説明できますか?セッションはすべてのWebRoleインスタンス間で共有されていますか?

4

1 に答える 1

2

それはすべて構成に依存しSession State Providerます。

通常、カスタムプロバイダー(通常はWindows AzureCacheまたはSQLAzure)を実装して、複数のインスタンス間でセッションデータを永続化できるようにする必要があります。

http://msdn.microsoft.com/en-us/library/windowsazure/gg185668.aspx

ログインすると(どのインスタンスに関係なく)、SessionIDが含まれるCookieを受け取ります。

インスタンスへのさらなる要求により、アプリケーションは構成されたプロバイダーからのセッションデータを要求します。

于 2013-03-07T12:44:14.477 に答える