心跳期间的ServiceStack GetSession
ServiceStack GetSession during heartbeat
我有一个 servicestack 应用程序,我想在其中进行一些与会话相关的更新。
我的简化主机代码:
internal class SelfHost : AppSelfHostBase
{
public SelfHost() : base("HttpListener Self-Host", typeof(ServerEventsService).Assembly)
{
}
public override void Configure(Container container)
{
Plugins.Add(new ServerEventsFeature
{
LimitToAuthenticatedUsers = true,
NotifyChannelOfSubscriptions = false,
OnHeartbeatInit = req =>
{
var userSession = req.GetSession();
var sessionKey = SessionFeature.GetSessionKey(req.GetSessionId());
}
});
container.Register<ICacheClient>(new MemoryCacheClient());
Plugins.Add(new AuthFeature(() => new AuthUserSession(),
new IAuthProvider[]
{
new CredentialsAuthProvider
{
SessionExpiry = TimeSpan.FromSeconds(30),
SkipPasswordVerificationForInProcessRequests = true,
},
})
);
var userRep = new InMemoryAuthRepository();
container.Register<IUserAuthRepository>(userRep);
string hash;
string salt;
var pwd = "ValidPassword";
new SaltedHash().GetHashAndSaltString(pwd, out hash, out salt);
userRep.CreateUserAuth(new UserAuth
{
Id = 3,
DisplayName = "CustomDisplayName2",
Email = "test2@gmail.com",
UserName = "CustomUserName2",
FirstName = "FirstName2",
LastName = "LastName2",
PasswordHash = hash,
Salt = salt,
}, pwd);
}
}
和简化的客户端代码:
var mainClient = new ServerEventsClient(baseUrl, "home");
var authResponse = mainClient.Authenticate(new Authenticate
{
provider = "credentials",
UserName = "CustomUserName2",
Password = "ValidPassword",
RememberMe = false,
});
mainClient.Connect().Wait();
它连接和验证正常,有问题的部分从 OnHeartbeatInit
开始 - 我这里的会话始终是一个新的未验证会话,它只有 Id、CreatedAt 和 LastModified。我的服务在 class 级别上标有 [Authenticate]
属性。我是否配置错误或丢失了一些应该允许的配置?如果我 post 到我的服务并调用 Request.GetSession()
然后我得到一个填充的会话,我希望在 OnHeartbeatInit
中也看到它。
旁注:任何地方都没有隐藏的配置,我专门为此示例创建了一个单独的应用程序。
问题是在 .NET ServerEventsClient
中发送的心跳请求与客户端验证或连接到 /event-stream
所用的 CookieContainer
不同,即什么包含会话 Cookie。
我更新了 ServerEventsClient
,因此心跳请求现在为每个心跳请求引用相同的 CookieContainer in this commit。
此更改适用于现在 available on MyGet 的 v4.0.55。
我有一个 servicestack 应用程序,我想在其中进行一些与会话相关的更新。
我的简化主机代码:
internal class SelfHost : AppSelfHostBase
{
public SelfHost() : base("HttpListener Self-Host", typeof(ServerEventsService).Assembly)
{
}
public override void Configure(Container container)
{
Plugins.Add(new ServerEventsFeature
{
LimitToAuthenticatedUsers = true,
NotifyChannelOfSubscriptions = false,
OnHeartbeatInit = req =>
{
var userSession = req.GetSession();
var sessionKey = SessionFeature.GetSessionKey(req.GetSessionId());
}
});
container.Register<ICacheClient>(new MemoryCacheClient());
Plugins.Add(new AuthFeature(() => new AuthUserSession(),
new IAuthProvider[]
{
new CredentialsAuthProvider
{
SessionExpiry = TimeSpan.FromSeconds(30),
SkipPasswordVerificationForInProcessRequests = true,
},
})
);
var userRep = new InMemoryAuthRepository();
container.Register<IUserAuthRepository>(userRep);
string hash;
string salt;
var pwd = "ValidPassword";
new SaltedHash().GetHashAndSaltString(pwd, out hash, out salt);
userRep.CreateUserAuth(new UserAuth
{
Id = 3,
DisplayName = "CustomDisplayName2",
Email = "test2@gmail.com",
UserName = "CustomUserName2",
FirstName = "FirstName2",
LastName = "LastName2",
PasswordHash = hash,
Salt = salt,
}, pwd);
}
}
和简化的客户端代码:
var mainClient = new ServerEventsClient(baseUrl, "home");
var authResponse = mainClient.Authenticate(new Authenticate
{
provider = "credentials",
UserName = "CustomUserName2",
Password = "ValidPassword",
RememberMe = false,
});
mainClient.Connect().Wait();
它连接和验证正常,有问题的部分从 OnHeartbeatInit
开始 - 我这里的会话始终是一个新的未验证会话,它只有 Id、CreatedAt 和 LastModified。我的服务在 class 级别上标有 [Authenticate]
属性。我是否配置错误或丢失了一些应该允许的配置?如果我 post 到我的服务并调用 Request.GetSession()
然后我得到一个填充的会话,我希望在 OnHeartbeatInit
中也看到它。
旁注:任何地方都没有隐藏的配置,我专门为此示例创建了一个单独的应用程序。
问题是在 .NET ServerEventsClient
中发送的心跳请求与客户端验证或连接到 /event-stream
所用的 CookieContainer
不同,即什么包含会话 Cookie。
我更新了 ServerEventsClient
,因此心跳请求现在为每个心跳请求引用相同的 CookieContainer in this commit。
此更改适用于现在 available on MyGet 的 v4.0.55。