标准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会话显示了IsAuthenticatedtrue,但其他会话数据(如名字/姓氏和时区)都不可访问。

因为我所说的时间大约是12个小时,我怀疑会话真的没有仍然经过身份验证。我尝试在web.config中启用FormsAuthentication,但这搞砸了api端点,即使我在web.config的location部分下将其排除在外。

有什么想法吗?

标准MVC中的ServiceStack身份验证

考虑到ServiceStack会话只是序列化到注册的缓存提供程序中的类型化POCO,IsAuthenticated=true(但没有填充任何其他属性)是可疑的。我会检查底层缓存提供程序中的序列化值,看看是否真的是这样。突出的一点是,您在AuthFeature中指定使用CustomUserSession,但却试图将其解析为AuthUserSession,因此需要使用相同类型的会话。

如果您将MVC与ServiceStack一起使用,建议通过继承ServiceStackController并使用解决控制器中的ServiceStack会话,使用官方API来解决会话

var session = base.SessionAs<CustomUserSession>();