[除錯][ASP.NET 4.x MVC][C#] HttpAntiForgeryException: 提供的反仿冒語彙基元是針對使用者 "XX",但是目前的使用者是 "SS"

使用者的巧思,就是我寫文章和紀錄的動力。

錯誤1:
錯誤訊息:System.Web.Mvc.HttpAntiForgeryException: 提供的反仿冒語彙基元是針對使用者 "",但是目前的使用者是 "XX"。
重現:
登入成功>> 瀏覽器[上一頁]>> 在一次按下【登入】>> 出現錯誤
解釋:
引用參考資料文字說明:原本登入的頁面是沒 User.Identity 的,在登一次的時候,表單的 User.Identity 已經有值,自然匹配不到

錯誤2:
錯誤訊息:System.Web.Mvc.HttpAntiForgeryException: 提供的反仿冒語彙基元是針對使用者 "XX",但是目前的使用者是 ""。
重現:
引用參考資料文字說明: 停留在表單頁面至 Cookie 過期 -> 送出表單
解釋:
引用參考資料文字說明:原本表單的頁面是有包含 User.Identity 的 Token ,送出表單時,已經沒有 User.Identity,自然匹配不到

處理方式分享:
1. 網路有些文章慧說在Action加入以下程式碼,不適用此情境

//判斷使用者是否已經登入驗證
if (User.Identity.IsAuthenticated)

2.在Login 的Controller中 override OnException

protected override void OnException(ExceptionContext filterContext)
{
	//記錄錯誤訊息

    //log.record(filterContext.Exception)

	// 如果登入 Cookie 過期 or 有可能案上一頁又在登入一次,造成表單防偽驗證失敗拋出 Exception,導回 Login 頁面重新登入
	if (filterContext.Exception is HttpAntiForgeryException)
	{
		var loginUrl = @Url.Action("Index", "Home");
		// 登入後又在一次登入
		if (filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
		{
			//在這寫處理方式,以下僅供參考	
			var queryString = filterContext.HttpContext.Request.QueryString["ReturnUrl"].ToString();

			// 取得剛剛 Exception 前的表單 Url
			var returnUrl = filterContext.HttpContext.Request.Path;
			if (string.IsNullOrEmpty(queryString))
				filterContext.Result = new RedirectResult(loginUrl);
			else
				filterContext.Result = new RedirectResult($"{queryString}");
		}
		else
		{
			filterContext.Result = new RedirectResult(loginUrl);
		}

		// 表示已經處理此例外事件
		filterContext.ExceptionHandled = true;
	}
	else
	{
		base.OnException(filterContext);
	}
}

參考資料:
解決 Cookie 過期後,表單 Token Exception (ValidateAntiForgeryToken)

相關文章:

嘗試以自己的角度來整理並紀錄,也許會對一些人有幫助。

文章有錯、參考聯結有漏或是連結失效..等,還請幫忙告知,謝謝。
另外參考資料中有很多更棒的文章,建議多看看。