[英]ASP.NET MVC3 Forms Authentication Expiring Prematurely
我們有一個使用MVC3構建的在線評估平台。 它在運行Windows Server 2012 R2的單個專用服務器上的IIS中運行,我們可以完全控制該服務器。 最近,用戶報告說他們在評估過程中“被注銷”。這是一個問題,因為我們的許多評估都有時間限制,並且會以寶貴的時間重新登錄用戶。
我無法在測試過程中重復該問題,但是通過查閱我們的日志已確認,在過去的2個月中,約有15-20%的用戶必須在評估期間的某個時間重新登錄。 在此之前的10個月中,只有<2%的用戶必須重新登錄。
我已經將當前的代碼庫與3個月前的代碼庫進行了比較,甚至沒有任何與登錄和身份驗證遠程相關的更改。 據我所知,服務器上的設置沒有更改。
此應用程序中有數百個文件和數千行代碼,但是我將嘗試共享相關的內容,希望有人能幫助我解決此問題。 如果有任何我想念的信息,請發表評論,我會盡快添加。
從Web.config:
<authentication mode="Forms">
<forms loginUrl="~/Login/" timeout="300" slidingExpiration="true" />
</authentication>
這是我們創建身份驗證Cookie的方式:
Guid User_Id = /* lookup id with username after verification */
string User_Role = /* CSV specifying the roles the user has */
DateTime Expiry = DateTime.Now.AddHours(5);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, User_Id.ToString(), DateTime.Now, Expiry, false, User_Role, "/");
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
cookie.Expires = Expiry;
HttpContext.Current.Response.Cookies.Add(cookie);
我們使用AuthorizeAttribute的自定義實現來限制對大多數操作的訪問,例如:
public class MyController : Controller
{
[CustomAuthorize(Roles = "MyRole")]
public ActionResult MyAction()
{
// do some stuff
return View();
}
}
其中定義如下:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
string cookieName = FormsAuthentication.FormsCookieName;
if (!filterContext.HttpContext.User.Identity.IsAuthenticated ||
filterContext.HttpContext.Request.Cookies == null ||
filterContext.HttpContext.Request.Cookies[cookieName] == null
)
{
HandleUnauthorizedRequest(filterContext);
return;
}
var authCookie = filterContext.HttpContext.Request.Cookies[cookieName];
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(',');
var userIdentity = new GenericIdentity(authTicket.Name);
var userPrincipal = new GenericPrincipal(userIdentity, roles);
filterContext.HttpContext.User = userPrincipal;
base.OnAuthorization(filterContext);
}
}
這是過去3年的設置,只有最近2個月才出現問題。 如您所見,cookie設置為在其創建后5小時過期。 用戶通常對其報告非常含糊,查看我們的日志,從初始登錄到再次登錄之間的時間間隔介於幾分鍾到幾小時之間。 即便如此,我還是在服務器上查看了我認為是相關的設置,但是看不到任何可能引起問題的內容:
我唯一能想到的將導致它們被“注銷”的原因是身份驗證Cookie會過早過期(或者我想將其刪除)。 我們正在談論來自數百家公司的數千個用戶。 許多人使用的是自己的PC,而不是工作所提供的PC。 如果有任何想法,我很想聽聽他們的想法。
由於使用的是Response.Add
而不是SetCookie
您定義了一個固定的有效期限,以使cookie持續存在,因此,如果用戶在這五個小時內兩次登錄,則有時會形成兩次發出的cookie。
我會檢查這是否不會混淆表單身份驗證模塊。 這樣的多個cookie之一可能在某個時間點到期,並且滑動到期迫使它重新發出。 這可能會打開一個場景,其中單個請求中有多個Cookie,其中一些可能已過期。
我的建議是使用http調試器進行檢查,然后替換代碼,從而可能會使您的auth cookie重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.