cookies - 在 Web.Config 中设置 ServiceStack Cookie 域会导致 session ID 在每次请求时发生变化

标签 cookies servicestack session-cookies

根据 ServiceStack - Authentication for domain and subdomains ,我在 httpCookies 部分设置了 cookie 域,它实际上有效 - 它正确设置了 cookie 的域。

但我注意到,一旦我将此行添加到配置中,每个请求都会生成一个新的 session ID,无论用户是否已经过身份验证。

我的代码很简单。

我的应用主机代码:

public override void Configure(Funq.Container container)
{
        Plugins.Add(new AuthFeature(() => new CustomUserSession(),
            new IAuthProvider[] {        
                    new CustomCredentialsProvider(), 
                }));

        container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("10.211.55.2:6379"));
        container.Register<ICacheClient>(c => c.Resolve<IRedisClientsManager>().GetCacheClient());

        var userRep = new InMemoryAuthRepository();
        container.Register<IUserAuthRepository>(userRep);
}

我的自定义凭据提供程序:

public class CustomCredentialsProvider : CredentialsAuthProvider
{
    public override bool TryAuthenticate(ServiceStack.IServiceBase authService, string userName, string password)
    {
        return true;
    }

    public override void OnAuthenticated(ServiceStack.IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        session.UserAuthName = "test user";
        session.UserName = "test user";

        authService.SaveSession(session);
    } 
}

我的默认页面:

public partial class _Default : WebForms.App_Start.PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            //get session information in every way possible
            var session = this.UserSession;

            var sessionKey = SessionFeature.GetSessionKey();

            var session2 = SessionFeature.GetOrCreateSession<CustomUserSession>(this.Cache);

            var session3 = this.Cache.Get<CustomUserSession>(sessionKey);        

        }

上面的 sessionKey 将被发布并且在每次请求时保持不变(这是预期的)。添加:

<system.web>
  <httpCookies domain="localhost"/>

导致每个请求的sessionKey不同;几乎就像 cookie 立即过期一样。将域更改为“test.com”或“.test.com”之类的内容似乎没有什么不同。我将 127.0.0.1 localhost 和 127.0.0.1 test.com 添加到我的 Windows 主机文件中,以备不时之需。

同样,注释掉 httpCookies 行和 session ID 保持不变,即使在身份验证之后也是如此。添加上述行会导致 session 在每次请求时发生变化,无论是否进行身份验证。

正在设置 Cookie,并且在每次请求时都使用新的 session ID 设置它们。

我可能做错了什么,我应该在哪里覆盖此行为?任何帮助表示赞赏。

最佳答案

这看起来不像是 ServiceStack 问题,而是您的浏览器不接受返回的 cookie 的问题,因为您的测试域是无效的选择。

localhost 不是有效的 cookie 域:

您不应将域设置为 localhost,因为这不是有效的 cookie 域。要使 cookie 域被视为有效,它必须包含 .。因此,在使用 localhost 时,域值必须为 null

IP 地址不是有效的 cookie 域:

您不能将 IP 地址用作 cookie 域。所以设置127.0.0.1可以被浏览器认为是无效的。

主机文件:

您说您将 test.com 设置为指向 hosts 文件中的 127.0.0.1。鉴于您的 ServiceStack 服务正在监听环回地址,那么域 test.com 应该适用于该服务,但您必须在配置中反射(reflect)这一点,即

<system.web>
    <httpCookies domain="test.com"/>

您也可以直接在您的 AppHost Configure 方法中进行配置:

public override void Configure(Container container)
{
    Config = new HostConfig {
        RestrictAllCookiesToDomain = "test.com",
    };
}

如果 ServiceStack 正确设置了 cookie,正如您所说,那么问题就出在 cookie 没有被浏览器接受。您可以通过检查浏览器随请求发送的 cookie 来确认这一点。如果您没有看到随您的下一个请求发回的 cookie,则浏览器不接受它们。您必须确保您是从 http://test.com 而不是从 localhost127.0.0.1 发出请求。

关于cookies - 在 Web.Config 中设置 ServiceStack Cookie 域会导致 session ID 在每次请求时发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620622/

相关文章:

servicestack - 将 SELECT DISTINCT ON 与 OrmLite 结合使用

c# - 其请求中包含 Stream 的 ServiceStack 服务会破坏元数据页面

django - 无法使用有效的用户名和密码登录 django 管理页面

java - cookie中保存session id是什么概念?

authentication - 如何在启用 cookie 的情况下使用 tomcat 身份验证?

c# - 我如何知道必须使用哪些 cookie 才能发出正确的 HttpWebRequest?

javascript - Cookie 向下滑动 div 并在重新加载时记住

php - 未设置 Cookie,但其余代码正在执行?

c# - MissingMethodException 全局.asax.cs

android webview 或浏览器在设备重启时不删除 session cookie