[英]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
根據需要替換username
和password
。 這應該會讓你有效的會話。
然后,您應該通過在瀏覽器開發者控制台中檢查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.