servicestack,session-cookies,Cookies,servicestack,Session Cookies" /> servicestack,session-cookies,Cookies,servicestack,Session Cookies" />

Cookies 在Web.Config中设置ServiceStack Cookie域会导致会话Id在每次请求时更改

Cookies 在Web.Config中设置ServiceStack Cookie域会导致会话Id在每次请求时更改,cookies,servicestack,session-cookies,Cookies,servicestack,Session Cookies,根据,我在httpCookies部分设置了cookie域,它实际上是有效的——它正确地设置了cookie的域 但我注意到的是,一旦我将这一行添加到配置中,就会在每个请求上生成一个新的会话id,而不管用户是否已经过身份验证 我的代码简单明了 我的应用程序主机代码: public override void Configure(Funq.Container container) { Plugins.Add(new AuthFeature(() => new CustomUs

根据,我在httpCookies部分设置了cookie域,它实际上是有效的——它正确地设置了cookie的域

但我注意到的是,一旦我将这一行添加到配置中,就会在每个请求上生成一个新的会话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 override void Configure(Funq.Container)
{
添加(新的AuthFeature(()=>新的CustomUserSession(),
新IAuthProvider[]{
新建CustomCredentialsProvider(),
}));
容器.Register(c=>newpooleredisclientmanager(“10.211.55.2:6379”);
Register(c=>c.Resolve().GetCacheClient());
var userRep=new InMemoryAuthRepository();
容器注册(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);
    } 
}
公共类CustomCredentialsProvider:CredentialsAuthProvider { public override bool TryAuthenticate(ServiceStack.IServiceBase authService、字符串用户名、字符串密码) { 返回true; } 已验证的公用覆盖无效(ServiceStack.IServiceBase authService、IAuthSession会话、IAuthTokens令牌、字典authInfo) { session.UserAuthName=“测试用户”; session.UserName=“测试用户”; authService.SaveSession(会话); } } 我的默认页面:

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);        

        }
public分部类\u默认值:WebForms.App\u Start.PageBase
{
受保护的无效页面加载(对象发送方、事件参数e)
{
尝试
{
//尽可能获取会话信息
var session=this.UserSession;
var sessionKey=SessionFeature.GetSessionKey();
var session2=SessionFeature.GetOrCreateSession(this.Cache);
var session3=this.Cache.Get(sessionKey);
}
上面的sessionKey将被发布,并且在每个请求(这是预期的)上保持不变。添加:


导致sessionKey在每个请求中都不同;就像cookie立即过期一样。将域更改为“test.com”或“.test.com”似乎没有什么区别。为了更好地衡量,我在windows主机文件中添加了127.0.0.1 localhost和127.0.0.1 test.com

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

正在设置cookie,并且在每个请求中都使用新的会话id设置cookie


我可能做错了什么?我应该在哪里重写此行为?非常感谢您的帮助。

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

localhost
不是有效的cookie域: 您不应该将域设置为
localhost
,因为这是无效的cookie域。要认为cookie域有效,它必须包含
。因此,使用localhost时,域值必须为
null

IP地址不是有效的cookie域: 您不能将IP地址用作cookie域。因此,浏览器可能会认为设置
127.0.0.1
无效

主机文件: 您说过您已将
test.com
设置为指向主机文件中的
127.0.0.1
。如果您的ServiceStack服务正在侦听环回地址,则域
test.com
应适用于该服务,但您必须在配置中反映这一点,即


您也可以直接在AppHost
configure
方法中配置:

public override void Configure(容器)
{
Config=newhostconfig{
限制所有CookiesToDomain=“test.com”,
};
}

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

谢谢Scott,这就是问题所在-当我在ServiceStack上展开搜索时发现了类似的信息

唯一的另一个技巧是让VisualStudio在本地调试时使用自定义域而不是标准的“localhost”(这解释了为什么每次请求都会重新生成会话)

还有其他线程演示了如何执行此操作,但在标准端口80之外没有其他示例。因此,我们开始:

  • 向主机文件添加一行:127.0.0.1 my.test.com
  • 打开IISExpress配置(C:\Users\someuser\Documents\IISExpress\config\applicationHost.config),找到项目的部分,并对其进行类似的修改:
  • 转到项目属性:将覆盖应用程序url设置为:并将开始url设置为:(或无论起始页或服务是什么)
我会发布一个截图,但我还没有名声:)


在Visual Studio中使用您选择的自定义域进行本地调试时,运行项目现在应该使用自定义域。

谢谢。我最初认为这是一个ServiceStack问题,但我对这些标准的实际工作原理缺乏了解-我重新标记了这个问题。这只是Cookie和域的工作原理。
<system.web>
  <httpCookies domain="localhost"/>