我有一个ServiceStack API,位于&#34; api&#34; MVC项目的位置。除此API外,还有标准的MVC控制器和视图,使用HostContext.ResolveService<MyService>(HttpContext)
调用ServiceStack服务。
我使用ServiceStack AuthenticateService
进行身份验证设置,调用Authenticate(new Authenticate {...})
方法然后设置FormsAuthentication cookie。我没有在web.config中启用FormsAuthentication。这是AppHost.cs中的身份验证设置:
public void ConfigureAuth(Container container)
{
var authFeature = new AuthFeature(() => new CustomUserSession(), new IAuthProvider[]
{
new BasicAuthProvider(),
new CredentialsAuthProvider()
})
{
HtmlRedirect = "/Login",
MaxLoginAttempts = 5,
IncludeAssignRoleServices = false
};
Plugins.Add(authFeature);
Register<IUserAuthRepository>(new OrmLiteAuthRepository(Resolve<IDbConnectionFactory>())
{
UseDistinctRoleTables = true
});
Resolve<IUserAuthRepository>().InitSchema();
}
在应用程序的初始运行中,一切都很有效。未经身份验证的用户获取登录页面,将其登录,我可以提取名称和时区等会话数据。我在视图中访问会话以使用以下代码填充菜单:
@{
var key = SessionFeature.GetSessionKey() ?? "";
var sess = HostContext.Resolve<ICacheClient>().Get<AuthUserSession>(key).ConvertTo<CustomUserSession>();
}
Welcome @sess.FirstName @sess.LastName
但是,经过一段时间后会看到会话过期,虽然上面提到的ServiceStack会话显示true
IsAuthenticated
,但其他会话数据都没有,如姓/名和时区可以访问。
因为我谈论的时间段是12个小时,我怀疑会话真的还没有仍然经过身份验证。我尝试在web.config中启用FormsAuthentication,但这搞砸了api端点,即使我在location
部分的web.config中将其排除。
任何想法可能出错?
答案 0 :(得分:0)
IsAuthenticated=true
可疑,但由于ServiceStack session只是序列化为已注册Caching Provider的类型化POCO,因此不会填充任何其他属性。我将检查底层缓存提供程序中的序列化值,看看是否真的如此。有一点突出的是,您已在AuthFeature中指定您正在使用CustomUserSession
,但您尝试将其解析为AuthUserSession
,则需要使用相同类型的会话。< / p>
如果您正在将MVC与ServiceStack一起使用,建议使用inheriting ServiceStackController的官方API解析会话,并使用以下代码解析控制器中的ServiceStack会话:
var session = base.SessionAs<CustomUserSession>();