我们聘请所需外的过程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);
}
}
}
}
不,returnUrl没有指向登录页面。用户登录并导航到我们网站上的另一个页面时,他们被重定向到登录页面,并且在重定向之前,returnUrl显示了预期的URL。如果用户已经登录并且他们要导航到登录页面(他们将通过在地址栏中输入url来完成登录),他们将被注销,因为不提供密码。 – alan 2011-01-31 21:33:41
@alan:偏题:在这种情况下,我不会注销用户。简单的重定向到“索引”会更安全。 – msms 2011-01-31 21:39:01
我注意到,我还会更新我的登录操作代码以反映新的更改。而不是重新验证用户,我会检查用户是否通过身份验证。 – alan 2011-01-31 22:17:02