标准MVC中的ServiceStack身份验证
本文关键字:身份验证 ServiceStack 中的 MVC 标准 | 更新日期: 2023-09-27 18:26:18
我有一个ServiceStack API驻留在MVC项目的"API"位置。除了这个API,还有使用HostContext.ResolveService<MyService>(HttpContext)
调用ServiceStack服务的标准MVC控制器和视图。
我使用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会话显示了IsAuthenticated
的true
,但其他会话数据(如名字/姓氏和时区)都不可访问。
因为我所说的时间大约是12个小时,我怀疑会话真的没有仍然经过身份验证。我尝试在web.config中启用FormsAuthentication,但这搞砸了api端点,即使我在web.config的location
部分下将其排除在外。
有什么想法吗?
考虑到ServiceStack会话只是序列化到注册的缓存提供程序中的类型化POCO,IsAuthenticated=true
(但没有填充任何其他属性)是可疑的。我会检查底层缓存提供程序中的序列化值,看看是否真的是这样。突出的一点是,您在AuthFeature中指定使用CustomUserSession
,但却试图将其解析为AuthUserSession
,因此需要使用相同类型的会话。
如果您将MVC与ServiceStack一起使用,建议通过继承ServiceStackController并使用解决控制器中的ServiceStack会话,使用官方API来解决会话
var session = base.SessionAs<CustomUserSession>();