检测信号期间的 ServiceStack GetSession

本文关键字:ServiceStack GetSession 信号 检测 | 更新日期: 2023-09-27 18:37:20

我有一个服务堆栈应用程序,我想在其中进行一些与会话相关的更新。
我的简化主机代码:

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。我的服务在类级别上标有[Authenticate]属性。我是否配置错误或丢失了一些应该允许这样做的配置?如果我发布到我的服务并打电话给Request.GetSession()那么我会得到一个填充的会话,我希望在OnHeartbeatInit中看到。
旁注:任何地方都没有隐藏的配置,我专门为此示例创建了一个单独的应用程序。

检测信号期间的 ServiceStack GetSession

问题是,在 .NET ServerEventsClient 中发送的检测信号请求的发送方式与客户端进行身份验证或连接到/event-stream所用的CookieContainer不同,而是包含会话 Cookie 的内容。

我已经更新了ServerEventsClient,因此心跳请求现在为此提交中的每个心跳请求引用相同的 CookieContainer。

此更改从 v4.0.55 开始提供,现已在 MyGet 上提供。