使用Owin Cookie身份验证存在一个奇怪的问题。
当我启动IIS服务器时,身份验证在IE / Firefox和Chrome上运行正常。
我开始使用身份验证进行一些测试,然后在不同的平台上登录,但遇到了一个奇怪的错误。有时,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.contents ...的页面。3)打开新的浏览器(Firefox)并尝试登录,它没有收到ASP.NET_SessionId,也没有获得身份验证Cookie 4)第一个浏览器具有ASP.NET_SessionId,它可以继续工作。我删除该Cookie的那一刻,它与我在ip地址(10.xxx)和本地主机上使用的所有其他浏览器都存在相同的问题。
更新2:ASPNET_SessionId
在使用OWIN进行身份验证之前,在我的login_load页面上强制创建first。
1)在我通过OWIN进行身份验证之前,我Session.Content
在登录页面上输入了一个随机值以启动ASP.NET_SessionId 2)然后进行身份验证并进行了进一步的会话3)其他浏览器现在似乎可以正常工作
真奇怪 我只能得出结论,这与ASP和OWIN有关,以为它们位于不同的域或类似的域中。
更新3-两者之间的奇怪行为。
确定的其他奇怪行为-Owin超时和ASP会话不同。我看到的是,通过某种机制,我的Owin会话比ASP会话的存活时间更长。因此,在登录时:1.)我有一个基于cookie的身份验证会话2.)我设置了一些会话变量
我的会话变量(2)在owin cookie会话变量之前强制“死”,这将导致整个应用程序发生意外行为。(人员已登录,但尚未真正登录)
更新3B
经过一番挖掘后,我在页面上看到一些评论,说“表单”身份验证超时和会话超时需要匹配。我通常认为两者是同步的,但是无论出于何种原因,两者都不同步。
解决方法摘要
1)始终在身份验证之前先创建一个会话。启动应用程序时基本上创建会话Session["Workaround"] = 0;
2)[实验],如果您保留cookie,请确保您的OWIN超时/长度大于web.config中的sessionTimeout(测试中)