首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET_SessionId + OWIN Cookie不会发送到浏览器

ASP.NET_SessionId + OWIN Cookie不会发送到浏览器
EN

Stack Overflow用户
提问于 2013-12-23 13:39:35
回答 9查看 86.2K关注 0票数 161

我在使用Owin cookie身份验证时遇到了一个奇怪的问题。

当我启动时,我的IIS服务器身份验证在IE/Firefox和Chrome上工作得很好。

我开始在不同的平台上做一些认证和登录的测试,我发现了一个奇怪的错误。Owin framework / IIS偶尔不会向浏览器发送任何cookie。我将输入正确的用户名和密码,代码会运行,但根本没有cookie传递到浏览器。如果我重新启动服务器,它将开始工作,然后在某个时候,我将尝试登录,并再次停止发送cookie。单步执行代码不会做任何事情,也不会抛出错误。

代码语言:javascript
运行
复制
 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);
                     }
                 }
               }
        });

,在我的登录过程中,我有以下代码:

代码语言:javascript
运行
复制
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长(在测试中)

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20737578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档