对于使用 Owin cookie 身份验证,我有一个奇怪的问题。
当我开始我的 IIS 服务器验证在 IE/Firefox 和 Chrome 上运行的非常好。
我开始使用 Authentication 进行一些测试,并在不同的平台上登录,我发现了一个奇怪的错误。偶尔 Owin 框架/IIS 不会向浏览器发送任何 cookie。我会输入一个用户名和密码,这是正确的代码运行,但没有 Cookie 得到传递到浏览器。如果我重新启动服务器,它开始工作,然后在某个时候,我会尝试登录,再次 Cookie 停止得到交付。跳过代码不执行任何操作,也不抛出任何错误。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
在我的登录过程中,我有以下代码:
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
authentication.AuthenticationResponseGrant =
new AuthenticationResponseGrant(identity, new AuthenticationProperties()
{
IsPersistent = isPersistent
});
authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);
更新1: 似乎问题的一个原因是当我向会话中添加项时,问题就开始了。添加像 Session.Content["ABC"]= 123
这样简单的东西似乎会造成问题。
我能看出来的情况如下: 1)(Chrome)当我登录时,我会得到 ASP.NET _ SessionId + 我的身份验证 cookie。 2)我进入一个设置 session. content 的页面..。 3)打开一个新的浏览器(Firefox)并尝试登录,它不会收到 ASP.NET _ SessionId,也不会收到验证 Cookie 4)虽然第一个浏览器有 ASP.NET _ SessionId,但它仍然可以工作。一旦我删除了这个 cookie,它就会和其他浏览器一样出现同样的问题 我正在处理 ip 地址(10.x.x.x)和 localhost。
更新2: 在使用 OWIN 进行身份验证之前,首先在我的 login _ load 页面上强制创建 ASPNET_SessionId
。
1)在使用 OWIN 进行身份验证之前,我在登录页面上创建一个随机的 Session.Content
值来启动 ASP.NET _ SessionId
2)然后我认证并进行进一步的会话
3)其他浏览器现在似乎也可以用了
这太奇怪了。我只能得出这样的结论,这与 ASP 和 OWIN 认为他们在不同的领域或类似的东西有关。
更新3 -两者之间的奇怪行为。
其他奇怪的行为识别-Owin 和 ASP 会话的超时是不同的。我看到的是,通过某种机制,我的 Owin 会话比 ASP 会话存活的时间更长。因此,登录时: 1)我有一个基于 cookie 的授权会话 我设置了一些会话变量
我的会话变量(2)在 owin cookie 会话变量之前“死亡”,强制重新登录,这会导致整个应用程序出现意外行为。(此人已登录,但并未真正登录)
更新3B
深入研究之后,我在一个页面上看到一些评论,说“ Forms”身份验证超时和会话超时需要匹配。我认为通常情况下,两者是同步的,但不管出于什么原因,两者并不同步。
工作区摘要
1)在验证之前总是先创建会话。基本上是在启动应用程序 Session["Workaround"] = 0;
时创建会话
2)[实验]如果你坚持 cookie 请确保你的 OWIN 超时/长度比 web.config 中的 sessionTimeout 长(测试中)