2015-09-28 47 views
-1

在我的MVC5應用程序中,實施了防僞標記。當用戶啓動並登錄時,它可以工作。在情況下,如果用戶點擊瀏覽器登錄後回,並重新提交與不同的憑據,這表明瀏覽器背面的防僞標記問題並重新提交

The provided anti-forgery token was meant for user "xxxx", but the current user is "yyyy" 

在登錄器,我已經試過類似

public ActionResult Index() 
{ 
    if (User != null && (User.Identity.IsAuthenticated || User.Identity.Name != "")) 
    { 
     FormsAuthentication.SignOut(); 
     Session.Abandon(); 
     return RedirectToAction("Index"); 
    } 
    return View(); 
} 

但該系統不火在這種情況下的行動。

+0

你能解釋一下'launch and login'是什麼意思嗎? – staticvoidmain

+0

啓動應用程序並登錄到系統 –

回答

0

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult Login(...) 

裝飾你的登錄GET方法,以防止被緩存的頁面。這將強制在沒有先前登錄的用戶名稱的情況下創建新的令牌。

3

這是常見的,當我們有反僞造令牌。

發生這種情況,因爲防僞標誌嵌入用戶的用戶名作爲更好的驗證的加密令牌的一部分。 當你第一次打電話給@ Html.AntiForgeryToken()時,用戶沒有登錄 ,因此令牌將有一個空字符串作爲用戶名,在 用戶登錄後,如果你沒有更換防僞標記,而不是 通過驗證,因爲最初的令牌是匿名用戶,而現在我們有一個具有已知用戶名的已驗證用戶。

您有幾種選擇來解決這個問題:

1 - 就在這個時候讓你的應用程序做了充分的POST當 頁面重新加載,將有更新的 的防僞標記用戶名嵌入。

2-曾經使用過@ Html.AntiForgeryToken()和右 的局部視圖登錄後,做另一個AJAX請求並經請求的響應替換現有 防僞標記。

3-只需禁用身份檢查 執行的防僞驗證。將以下內容添加到您的Application_Start方法中: AntiForgeryConfig.SuppressIdentityHeuristicChecks = true。

針對AntiForgeryToken運行的驗證代碼還會檢查您登錄的用戶憑證是否未更改 - 這些還在Cookie中加密。這意味着,如果你在或出一個彈出窗口或其他瀏覽器選項卡登錄,您的表單提交將失敗,但以下情況除外:

System.Web.Mvc.HttpAntiForgeryException (0x80004005): 
The provided anti-forgery token was meant for user "xxxx", but the current user is "yyyy". 

您可以通過將AntiForgeryConfig.SuppressIdentityHeuristicChecks = TRUE關閉此功能;在Global.asax文件中的Application_Start方法中。

當AntiForgeryToken未驗證您的網站時,會拋出System.Web.Mvc.HttpAntiForgeryException類型的異常。通過捕獲HttpAntiForgeryException,您至少可以通過向用戶提供更多針對這些異常的信息頁面來簡化操作。

private void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 

    if (ex is HttpAntiForgeryException) 
    { 
     Response.Clear(); 
     Server.ClearError(); //make sure you log the exception first 
     Response.Redirect("/error/antiforgery", true); 
    } 
} 

Here是類似問題的SO線程。

additional參考。

選擇此答案,如果有幫助。謝謝