As per ServiceStack - 域和子域的身份验证,我在 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都不同;几乎就像 cookie 立即过期一样。将域名更改为“test.com”或“.test.com”之类的内容似乎没有什么区别。为了更好的测量,我将 127.0.0.1 localhost 和 127.0.0.1 test.com 添加到我的 Windows 主机文件中。
同样,注释掉 httpCookies 行和会话 ID 保持不变,即使在进行身份验证后也是如此。添加以上行会导致会话在每次请求时发生更改,无论是否进行身份验证。
正在设置 Cookie,并在每次请求时使用新的会话 ID 来设置它们。
我可能做错了什么以及我应该在哪里覆盖这种行为?任何帮助表示赞赏。