簡體   English   中英

ASP.NET MVC3表單身份驗證過早過期

[英]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小時過期。 用戶通常對其報告非常含糊,查看我們的日志,從初始登錄到再次登錄之間的時間間隔介於幾分鍾到幾小時之間。 即便如此,我還是在服務器上查看了我認為是相關的設置,但是看不到任何可能引起問題的內容:

IIS設置

我唯一能想到的將導致它們被“注銷”的原因是身份驗證Cookie會過早過期(或者我想將其刪除)。 我們正在談論來自數百家公司的數千個用戶。 許多人使用的是自己的PC,而不是工作所提供的PC。 如果有任何想法,我很想聽聽他們的想法。

由於使用的是Response.Add而不是SetCookie您定義了一個固定的有效期限,以使cookie持續存在,因此,如果用戶在這五個小時內兩次登錄,則有時會形成兩次發出的cookie。

我會檢查這是否不會混淆表單身份驗證模塊。 這樣的多個cookie之一可能在某個時間點到期,並且滑動到期迫使它重新發出。 這可能會打開一個場景,其中單個請求中有多個Cookie,其中一些可能已過期。

我的建議是使用http調試器進行檢查,然后替換代碼,從而可能會使您的auth cookie重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM