2011-01-31 66 views
3

我们聘请所需外的过程SQL会话状态,ASP.NET MVC 3.5和1.0表单中使用IIS 7ASP.NET 3.5 MVC1 - 用户随机未经认证/重新登录

用户的会话验证是在登录时正确设置,并按预期超时,将其重定向到特殊的“超时”登录页面。问题在于一些(不是全部)用户登录,并且(从我所知道的)立即未经身份验证并且需要重新登录(即重定向到原始“登录”页面)。

任何人都可能有一个想法,为什么我们的用户间歇性被踢出?

编辑:我已经在每个Application_AuthenticateRequest事件上添加了日志记录,我可以告诉你,在用户启动之前,Auth票证都已通过身份验证,持续两天后过期并且请求也通过身份验证。到达登录页面后,用户不再通过身份验证。

编辑#2:我们取得了一些进展,看起来好像用户可能未经过身份验证,因为此Web应用程序正在寻找父应用程序中的脚本和其他内容,而其中的用户未通过身份验证。列入这些脚本的原始格式如下:

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script> 

我已将其更正为:

<script src="<%= Url.Content("~/Scripts/MicrosoftAjax.js") %>" type="text/javascript"></script> 

ANSWER在我们的.master页以上改变我们的脚本引用解决了问题。它明确告诉应用程序查看当前应用程序的根文件夹。感谢所有帮助过的人。我希望我可以标记不止一个答案!

下面是我们的登录操作:

[AcceptVerbs(HttpVerbs.Post)] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", 
     Justification = "Needs to take same parameter type as Controller.Redirect()")] 
    public virtual ActionResult LogOn(string userName, string password, string returnUrl) 
    { 
     if ((HttpContext.Current.User == null) || (!HttpContext.User.Identity.IsAuthenticated)) 
     { 
      if (!ValidateLogOn(userName, password)) 
      { 
       try 
       { 
       return View(); 
       } 
       catch (Exception ex) 
       { 
       throw new Exception(string.Format("User validation failed at LogOn: {0}", ex.ToString())); 
       } 
      } 
     } 

     bool rememberMe = true; 

     FormsAuth.SignIn(userName, rememberMe); 

     Session["userName"] = userName; 

     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      try 
      { 
       return Redirect(returnUrl); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(string.Format("User redirect to returnUrl ({0}) failed: {1}", returnUrl, ex.ToString())); 
      } 
     } 
     else 
     { 
      try 
      { 
       return RedirectToAction("Index", "RodWebUI"); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(string.Format("User redirect to action: Index, controller: RodWebUi failed: {0}", ex.ToString())); 
      } 
     } 
    } 

下面是我们timeoutlogon行动:

public virtual ActionResult TimeOutLogon() 
    { 
     try 
     { 
      FormsAuth.SignOut(); 

      ViewData["TimeoutMsg"] = "Session timed out. Please log back in."; 

      return View(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(string.Format("Error with redirecting to TimeOutLogon: {0}", ex.ToString())); 
     } 
    } 

因为我已经添加了以下检查,以我们的Global.asax中记录的当前状态请求和授权票。在被踢回LogOn之前,所有事情都经过认证和确定。

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 identity = (FormsIdentity)HttpContext.Current.User.Identity; 

        FormsAuthenticationTicket ticket = identity.Ticket; 

        LogFunctionCall(HttpContext.Current.User.Identity.Name, "", "User Authentication Check", "", 
             string.Format("Auth ticket is expired: {0}, expiration date: {1}, is persistent: {2}, issued: {3}", 
             ticket.Expired, ticket.Expiration, ticket.IsPersistent, ticket.IssueDate), "", 0); 

        LogFunctionCall(HttpContext.Current.User.Identity.Name, "", "User Authentication Check Line #2", "", 
             string.Format("Raw URL: {0}, Request is authenticated: {1}", HttpContext.Current.Request.RawUrl, HttpContext.Current.Request.IsAuthenticated), "", 0); 
       } 
      } 
     } 
    } 

回答

2

你有一个负载均衡的网站吗?

如果是这样,所有节点上的机器键是否相同? Forms Cookie名称是否相同?如果这些值存在差异,您可以在一个节点上登录并且似乎对另一个节点未经验证。

1

这可能是愚蠢的,但可以在RETURNURL被指向到登录页面?

当用户已经登录时,登录页面的行为如何?

+0

不,returnUrl没有指向登录页面。用户登录并导航到我们网站上的另一个页面时,他们被重定向到登录页面,并且在重定向之前,returnUrl显示了预期的URL。如果用户已经登录并且他们要导航到登录页面(他们将通过在地址栏中输入url来完成登录),他们将被注销,因为不提供密码。 – alan 2011-01-31 21:33:41

+0

@alan:偏题:在这种情况下,我不会注销用户。简单的重定向到“索引”会更安全。 – msms 2011-01-31 21:39:01

+0

我注意到,我还会更新我的登录操作代码以反映新的更改。而不是重新验证用户,我会检查用户是否通过身份验证。 – alan 2011-01-31 22:17:02

2

如果用户没有通过身份验证,或者他们没有权限查看他们正尝试访问的资源,则ASP.Net会将用户重定向到登录页面。

+0

这些页面上的所有资源都可以在用户被要求重新登录之前访问(例如,用户应该在一个点和几秒钟后访问一个页面,重新访问该页面才能启动) – alan 2011-02-02 14:59:28

+0

您是否拥有可靠的方法重现这个问题?你能确定地知道,当你提出某个要求时,问题会显示出来吗?如果是这样,我会在某处设置一个断点(global.asax中的BeginRequest将是一个好地方),然后检查请求,看看auth cookie是否存在。有可能是删除auth cookie(可以在客户端完成)。 – 2011-02-02 15:08:15

0

Spidey sense表示ASP.NET进程或应用程序池正在对您进行回收。可能发生的原因有几个。由于会议过程中,他们不会被这个事件吃掉。

我会查看事件日志,看看是否有任何hinkey正在发生。

1
public partial class MasterPage : System.Web.UI.MasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
    protected void signout_Click(object sender, EventArgs e) 
    { 
     Response.Write("<script language=javascript>var wnd=window.open('','newWin','height=1,width=1,left=900,top=700,status=no,toolbar=no,menubar=no,scrollbars=no,maximize=false,resizable=1');</script>"); 
     Response.Write("<script language=javascript>wnd.close();</script>"); 
     Response.Write("<script language=javascript>window.open('login.aspx','_parent',replace=true);</script>"); 
     Session["name"] = null; 
    } 
} 

我也加入所有网页的代码上。

protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.Cache.SetAllowResponseInBrowserHistory(false); 
    } 
} 
相关问题