我在使用Owin cookie身份验证时遇到了一个奇怪的问题。
当我启动时,我的IIS服务器身份验证在IE/Firefox和Chrome上工作得很好。
我开始在不同的平台上做一些认证和登录的测试,我发现了一个奇怪的错误。Owin framework / 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)打开一个新的浏览器(火狐)并尝试登录,它既不会收到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。)我有一个基于cookied的身份验证会话2。)我设置了几个会话变量
我的会话变量(2)在owin cookie会话变量之前“死”了,这会强制重新登录,这会在整个应用程序中导致意外的行为。(人员已登录,但未真正登录)
更新3B
经过一番挖掘后,我在一个页面上看到一些注释,上面写着“表单”身份验证超时和会话超时需要匹配。我认为这两者通常是同步的,但无论出于什么原因,这两者都不同步。
解决方法摘要
1)请始终在鉴权前先创建会话。基本上就是在启动应用程序Session["Workaround"] = 0;时创建会话
2)实验如果你持久化sessionTimeout,确保你的OWIN超时/长度比你web.config中的cookie长(在测试中)
https://stackoverflow.com/questions/20737578
复制相似问题