使用者的巧思,就是我寫文章和紀錄的動力。
錯誤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)
相關文章:
嘗試以自己的角度來整理並紀錄,也許會對一些人有幫助。
文章有錯、參考聯結有漏或是連結失效..等,還請幫忙告知,謝謝。
另外參考資料中有很多更棒的文章,建議多看看。