FormsAuthentication无法正常工作

时间:2009-12-22 18:47:15

标签: asp.net forms-authentication

我的网站在我的开发框中按预期工作。也就是说,formauthentication票证在30天后到期。这是通过以下代码

实现的
string roles = UserManager.getAuthenticationRoleString(txtUsername.Text);

HttpCookie formscookie = FormsAuthentication.GetAuthCookie(txtUsername.Text, true);

FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(formscookie.Value);

FormsAuthenticationTicket newticket = new FormsAuthenticationTicket(1, ticket.Name, DateTime.Now, DateTime.Now.AddDays(30), true, roles, ticket.CookiePath);

HttpCookie newCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newticket));
newCookie.Expires = DateTime.Now.AddDays(30);
Response.Cookies.Add(newCookie);

我用fiddler检查过期设置是否正确,我得到了这个

.ASPXAUTH=84AB5430CF4B1C5F9B59C9285288B41F156FCAFA2A169EACE17A7778A392FA69F66770FD8A08FFD06064B00F0BD788FEEC4A5894B7089239D6288027170A642B3B7EB7DB4806F2EBBCF2A82EE20FD944A38D2FE253B9D3FD7EFA178307464AAB4BCB35181CD82F6697D5267DB3B62BAD; expires=Thu, 21-Jan-2010 18:33:20 GMT; path=/; HttpOnly

所以我希望它能在30天后过期......但它只需要30分钟。

我还有其他3个关于我的环境/代码的有趣花絮

  1. 在生产方框中,有两个站点指向相同的代码,一个用于外部访问,另一个用于内部访问

  2. 当我因为过早过期而获得登录页面时,.ASPAUTH cookie仍然存在并发送到浏览器

  3. global.asax中有一些角色检查,如下所示

  4. -

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
    
            if (HttpContext.Current.User != null)
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    if (HttpContext.Current.User.Identity is FormsIdentity)
                    {
                        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                        FormsAuthenticationTicket ticket = id.Ticket;
    
                        // Get the stored user-data, in this case, our roles
                        string userData = ticket.UserData;
                        string[] roles = userData.Split('|');
                        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, roles);
                    }
                }
            }
        }
    

2 个答案:

答案 0 :(得分:2)

您需要将机器密钥标记添加到web.config文件中。它正在重新生成并导致你的过早超时。

这类似于以下问题:

figuring out why asp.net authentication ticket is expiring

答案 1 :(得分:0)

如果问题是生产盒上的用户被踢,并且必须通过FormsAuthentication再次登录,则问题可能是IIS相关而不是.NET。

我遇到了问题,之前应用程序中的所有超时设置都没有起作用,并且用户太早启动了。

检查网站和应用程序池的IIS设置。两者都有与超时相关的设置等。

如果是II6:

  • 在网站属性下 - >主目录标签 - >配置按钮 - >选项标签 - >这里有会话状态/长度信息
  • 在您网站的应用程序池下 - >性能和健康标签 - >两者都有几个可以回收你的池的设置(并且基本上强制重新登录)

要进行调试,您可以禁用池上的所有运行状况和性能检查,但要非常小心,因为如果应用程序失控,这可能会限制您的服务器。

您也可以尝试将超时设置放在web.config中:

<system.web>
    <authentication mode="Forms">
          <forms timeout="XXXXX"/>
    </authentication>
</system.web>

无论如何只是来自类似问题的个人经验的一些想法。希望它可能有所帮助!