标准MVC

时间:2015-12-09 18:55:42

标签: c# asp.net-mvc authentication servicestack

我有一个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中将其排除。

任何想法可能出错?

1 个答案:

答案 0 :(得分:0)

IsAuthenticated=true可疑,但由于ServiceStack session只是序列化为已注册Caching Provider的类型化POCO,因此不会填充任何其他属性。我将检查底层缓存提供程序中的序列化值,看看是否真的如此。有一点突出的是,您已在AuthFeature中指定您正在使用CustomUserSession,但您尝试将其解析为AuthUserSession,则需要使用相同类型的会话。< / p>

如果您正在将MVC与ServiceStack一起使用,建议使用inheriting ServiceStackController的官方API解析会话,并使用以下代码解析控制器中的ServiceStack会话:

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