在Web.Config中设置ServiceStack Cookie域会导致会话ID在每个请求上更改

时间:2014-05-12 23:36:50

标签: cookies servicestack session-cookies

根据ServiceStack - Authentication for domain and subdomains,我在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 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在每个请求中都不同;几乎像饼干即将到期。将域名更改为&#39; test.com&#39;或&#39; .test.com&#39;似乎没有什么区别。我将127.0.0.1 localhost和127.0.0.1 test.com添加到我的Windows主机文件中,以便进行测量。

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

正在设置Cookie,并且每次请求时都会使用新的会话ID进行设置。

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

2 个答案:

答案 0 :(得分:5)

这看起来不像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应该适用于该服务,但您必须在配置中反映出来,即

<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提出请求。

答案 1 :(得分:1)

感谢Scott,这是票据 - 结束时,我在搜索过程中扩展了ServiceStack时发现了类似的信息。

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

还有其他线程显示如何执行此操作但没有标准端口80之外的示例。所以我们开始:

  • 在hosts文件中添加一行:127.0.0.1 my.test.com
  • 打开IISExpress配置(C:\ Users \ someuser \ Documents \ IISExpress \ config \ applicationHost.config),找到项目的部分并将其更改为类似于:     <binding protocol="http" bindingInformation="*:1412:my.test.com" />
  • 转到项目属性:将覆盖应用程序网址设置为:http://my.test.com:1412并将启动网址设置为:http://my.test.com:1412/default(或任何您的起始网页或服务)。

我会发布截图,但我还没有声誉:)

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