簡體   English   中英

ServiceStack RememberMe不使用AngularJS在Azure上工作 - 會話超時太快

[英]ServiceStack RememberMe not working on Azure with AngularJS - Sessions Time Out Too Quickly

我們在Azure VM上安裝了一個Angular管理站點。 API是使用ServiceStack構建的,我們遇到了一個問題,當我們登錄並說“記住我”時,我們的用戶不會被記住。

這是我們的AppHost插件位。

Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[]
    {
        // it seems as though order matters here. If these are reversed, CredentialsAuth doesn't work.
        new CustomCredentialsAuthProvider(container),
        new CustomBasicAuthProvider(container)
    })
    {
        HtmlRedirect = "~/login.html"
    });

在Angular中,我們初始化了我們的憑據

    $scope.credentials = {
        userName: '',
        password: '',
        rememberMe: false
    };
    $scope.login = function (credentials) {

        if (!$scope.signinForm.$valid) {
            $scope.submitted = true;
            toaster.pop(nullFieldAlert);
            return;
        }

        authService.save(credentials,

            // Success
            function (data) {
                $rootScope.authenticated = true;
                history.back();
            },

            // Failure
            function (e) {
                handleErrors(e);
            });
    };

然后當用戶登錄時,他們可以選擇更改rememberMe = true;

不幸的是,無論是否設置了rememberMe,我們的會話都會在幾分鍾(有時是幾秒)內到期。

為了讓Azure上的會話持續> 3分鍾,我們需要做些什么,並讓RememberMe工作?

會議時間安排

您擔心的是您的會話過早到期。 這是你應該獨立於AngularJS測試的東西,因為正如我在下面提到的,我懷疑問題與AngularJS有關。

您應該直接從瀏覽器使用ServiceStack Api進行身份驗證:您可以通過導航到以下內容來執行此操作:

<your-api-url>/Auth?UserName=username&Password=password&x-http-method-override=POST

根據需要替換usernamepassword 這應該會讓你有效的會話。

然后,您應該通過在瀏覽器開發者控制台中檢查ss-id cookie來確認您有一個有效的會話。

使用此會話向安全服務請求數據,確定在會話到期之前可以訪問此數據的時間。 我懷疑以這種方式直接交互不會失敗,而是當您使用AngularJS時導致問題。

丟失$rootScope.authenticated狀態

我可能會在這里喋喋不休,因為人們以許多不同且令人興奮的方式構建他們的AngularJS應用程序,這是我對您提供的部分代碼的解釋。

我認為這個問題可能與您使用AngularJS記錄客戶端身份驗證狀態的方式有關,而不是ServiceStack問題。

當您的AuthService將憑據發送到ServiceStack進行身份驗證時,它將使用Angular的$http服務執行此操作。 鑒於您的憑據有效,ServiceStack將使用有效的會話cookie進行回復。 Angular將針對以下任何請求發送此會話cookie。

// Success
function (data) {
    $rootScope.authenticated = true;
    history.back(); // $rootScope on the other page won't be set when you go back
}

但是,您似乎正在根據$rootScope authenticated的變量確定身份驗證狀態。 因此,一旦您成功驗證您設置該變量。 但問題是你失去了這種狀態,通過使用history.back()導航到上一頁,因為這不在login.html的范圍內,你設置的$rootScope值不再存在。 因此,如果您依賴於此來確定您是否已登錄,則無法使用。

您需要做的是在應用程序啟動時恢復$rootScope.authenticated值。 請參閱我之前關於此問題的答案,該問題討論了如何跟蹤會話。

應用程序池回收

如果您的會話過早地過期,在測試之后,並且您在ServiceStack中使用In-Memory緩存(默認),請注意,如果IIS主機回收了您的服務的ApplicationPool ,則緩存數據也將被銷毀。 但對於這種情況經常發生是不尋常的。

您可以在global.aspx中的Application_Start事件中注銷,以記錄回收的頻率。

我在這里的答案涉及應用程序池的回收。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM