我们在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工作?
答案 0 :(得分:2)
您担心的是您的会话过早到期。这是你应该独立于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
}
但是,您似乎正在根据authenticated
中的变量$rootScope
确定身份验证状态。因此,一旦您成功验证您设置该变量。但问题是,您正在使用history.back()
导航到上一页失去此状态,因为这不在login.html
的范围内,您设置的$rootScope
值没有更长的存在。因此,如果您依赖于此来确定您是否已登录,则无法正常工作。
您需要做的是在应用程序启动时恢复$rootScope.authenticated
值。 See my previous answer on this issue,讨论如何跟踪会话。
如果过期,您的会话过早地过期,经过测试,并且您在ServiceStack中使用In-Memory
缓存(默认),请注意,如果您的服务的ApplicationPool被IIS主机回收然后缓存数据也将被销毁。但是,这种情况经常发生是不寻常的。
您可以在Application_Start
的{{1}}活动中退出,以了解回收的频率。
This answer of mine here触及应用程序池的回收。
我希望这会有所帮助。