는 센트리와 푸른 웹 서버 로그의 조합을 사용하여, 조사에 상당한 시간을 소비 한 후, 나는 언급 한 오류의 두 주요 원인을 발견했습니다
휴대 전화에
1),시 브라우저가 백그라운드에서 실행 중이면 OS가 갑자기 중지되어 자원을 비울 수 있습니다. 이 경우 일반적으로 페이지는 휴대 전화의 드라이브에 저장되고 브라우저가 다시 열리면 다시로드됩니다.
하지만 이번에는 세션 쿠키 인 위조 토큰이 본질적으로 새로운 세션이므로 이미 만료되었습니다. 따라서 이전 세션의 HTML을 사용하여 위조 방지 쿠키없이 페이지가로드됩니다. 이로 인해 The required anti-forgery cookie is not present
예외가 발생합니다.
2) 겉보기와 관련되어 있지만, tokens do not match
예외는 일반적으로 접선으로 만 관련됩니다. 원인은 동시에 여러 탭을 여는 사용자 행동 인 것 같습니다.
위조 방지 쿠키는 사용자가 양식이있는 페이지에 도착한 경우에만 할당됩니다. 이것은 그들이 당신의 홈페이지에 갈 수 있고 위조 방지 쿠키가 없다는 것을 의미합니다. 그런 다음 마우스 가운데 버튼을 사용하여 여러 개의 탭을 열 수 있습니다. 여러 탭은 여러 개의 병렬 요청으로, 위조 방지 쿠키가 없습니다.
이러한 요청에는 위조 방지 쿠키가 없으므로 각각에 대해 ASP.NET은 쿠키에 대해 별도의 의사 랜덤 토큰을 생성하고이를 양식에 사용합니다. 그러나 수신 된 마지막 헤더의 결과 만 유지됩니다. 이는 위조 방지 쿠키가 무시 되었기 때문에 다른 모든 페이지의 페이지에 유효하지 않은 토큰이 있음을 의미합니다.
솔루션을
, 나는 페이지가 어떤 형태가없는 경우에도,
- 안티 위조 쿠키가 모든 페이지에 할당되어 있는지 확인해야 글로벌 필터 및
- 안티를 만들었습니다 -Fortery 쿠키는 세션에 바인드되지 않습니다. 수명은 사용자 로그인 토큰과 일치하도록 조정해야하지만 모바일 장치가 세션없이 페이지를 다시로드하는 경우 세션간에 지속되어야합니다.
아래 코드는 내부에 전역 필터로 추가해야하는 FilterAttribute
입니다. 보안 구멍이 생길 것이라고 생각하지 않지만 보안 전문가가 아니므로 모든 의견을 환영합니다.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AntiForgeryFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var cookie = filterContext.HttpContext.Request.Cookies.Get(AntiForgeryConfig.CookieName);
var addCookie = true;
if (string.IsNullOrEmpty(cookie?.Value))
{
cookie = filterContext.HttpContext.Response.Cookies.Get(AntiForgeryConfig.CookieName);
addCookie = false;
}
if (string.IsNullOrEmpty(cookie?.Value))
{
AntiForgery.GetTokens(null, out string cookieToken, out string _);
cookie = new HttpCookie(AntiForgeryConfig.CookieName, cookieToken)
{
HttpOnly = true,
Secure = AntiForgeryConfig.RequireSsl
};
}
cookie.Expires = DateTime.UtcNow.AddYears(1);
if(addCookie) filterContext.HttpContext.Response.Cookies.Add(cookie);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
혹시이 답변을 찾았습니까? –
아니요, 우리는 위조 방지 검사를 제거해야했습니다 (간단한 통합 양식에 사용되었습니다. Azure 설치에는 두 개의 논리적 CD가 있었기 때문에 요청 및 응답을 처리하는 다른 CD와 관련이 있습니다. 그건 내 추측이야. – TamerM
슬픈 일이지만, 나는 당신이 폼 액션에 정의 된 도메인을 가지고 있지 않으면 (POST를 위해 사용자를 다른 CD로 리디렉션하지 않으면 문제가 될 것이라고 생각하지 않지만, UrlHelper를 사용하면 도메인간에 사용자를 리디렉션하지 않으므로이 경우가 해당됩니다. –