관리 메뉴

심재운 블로그

ASP.NET MVC 의 System.Web.Mvc.HttpAntiForgeryException (0x80004005) 위조 방지 토큰 문제 본문

닷넷관련/ASP.NET MVC & Core

ASP.NET MVC 의 System.Web.Mvc.HttpAntiForgeryException (0x80004005) 위조 방지 토큰 문제

재우니 2019. 4. 25. 10:19

https://stackoverflow.com/a/27017066


 

Anti forgery token on login page

I have implemented antiforgery token on my login page. Now I had one user pressing back key on the keyboard, and when they click on login button again after filling their credentials, they get er...

stackoverflow.com

문제


Azure ASP.NET MVC 사이트를 재배포 한 후 사용자가 처음 로그인 할 때 오류가 발생하는 것을 발견했습니다. 위조 방지 토큰 및 양식 필드 토큰이 일치하지 않습니다 .

...더보기

error=System.Web.Mvc.HttpAntiForgeryException (0x80004005): 제공된 위조 방지 토큰은 현재 사용자가 아닌 다른 클레임 기반 사용자를 위한 것입니다.
   위치: System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, IIdentity identity, AntiForgeryToken sessionToken, AntiForgeryToken fieldToken)
   위치: System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext)
   위치: System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor)
   위치: System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.b__19(AsyncCallback asyncCallback, Object asyncState)

원인

이는 Azure가 모든 배포에서 완전히 새로운 가상 시스템을 생성하기 때문에 발생합니다. 새 VM에 포함 된 새 IIS 인스턴스에는 인증 토큰의 유효성을 검사하는 데 사용되는 키인 새 machineKey가 있습니다.

따라서 로그인 양식에 마지막으로 로그인 한 사용자의 브라우저에있는 <input __RequestVerificationToken>이전 RequestVerificationToken쿠키 값 과 다른 값을 가진 입력란이 있습니다.

Azure를 사용하지 않는 경우의 해결책

제어 할 수있는 일반 IIS 서버를 사용하는 경우 machineKey인증 토큰이 만료되지 않도록 web.config 파일에서 응용 프로그램에 대한 사용자 지정 사용자 지정  설정하십시오 . 이 키는 기계의 machineKey값 대신에 사용됩니다 .

<system.web>
<machineKey
	validationKey="8BD520C9D14734C556DA74704FCABD3F8D59D7F851D563514208A86511884E"
	decryptionKey="CFB832E5A77F28A9A5B58DBE71AFC4D9C99D700F2488B"
	validation="SHA1" decryption="AES"
/>

다음과 같은 도구를 사용하여 사용자 지정 키를 생성하세요. http://www.developerfusion.com/tools/generatemachinekey/

Azure에서 작동하지 않습니다.

안타깝게도 Azure는 자체적으로 응용 프로그램 machineKey를 재정의하므로이 솔루션은 Azure 이외의 ASP.NET 사이트 ( " 다른 VM의로드 밸런서 뒤에있는 모든 Windows Azure 인스턴스) 에서만 작동합니다 . 그리고 각각은 동일한 machineKey (VewState 및 세션 상태 암호화에 사용됨)를 작동해야합니다. Azure 에뮬레이터가 앱을 실행할 때 Web.config를 변경하려고하는 이유가 그 때문입니다. "- 포럼

모든 ASP.NET 사이트를 위한 해결점

Azure에서 작동하는 솔루션 __RequestionVerificationToken은 로그인 페이지를 로드 할 때 사용자의 쿠키를 업데이트해야합니다 . 로그인 및 가입 페이지에 대해 AccountController GET 메소드에서 다음 코드를 사용하십시오.

private void SetANewRequestVerificationTokenManuallyInCookieAndOnTheForm()
{
    if (Response == null)
        return;
    string cookieToken, formToken;
    AntiForgery.GetTokens(null, out cookieToken, out formToken);
    SetCookie("__RequestVerificationToken", cookieToken);
    ViewBag.FormToken = formToken;
}

private void SetCookie(string name, string value)
{
   if (Response.Cookies.AllKeys.Contains(name))
       Response.Cookies[name].Value = value;
   else
       Response.Cookies.Add(new HttpCookie(name, value));
}

그런 다음 View 에서 토큰 쌍이 일치하도록 Controller 에서 생성 한 form Token 을 추가하십시오.

@if (ViewBag.FormToken != null)
{
    <text><input name="__RequestVerificationToken" type="hidden" value="@ViewBag.FormToken" /></text>
}
else
{
    <text>@Html.AntiForgeryToken()</text>
}

Anti-forgery tokens 은 로그인 및 가입 페이지에서 필수적입니다.

아마도  [ValidateAntiForgeryToken] 의 문제를 해결하기 위해 로그인 Action 에서 attribute  제거를 했을 거라 생각합니다. 하지만 이것은 위험한 실수입니다. 여기 예제 공격을 보십시오. : http://security.stackexchange.com/questions/2120/when-the-use-of-a-antiforgerytoken-is-not-required-needed .

간략히 말하면, 해커는 다른 사람의 브라우저를 해커로 웹 사이트 (예 : Paypal)에 서명 한 다음 신용 카드를 계정에 추가하는 등의 조치를 취할 수 있습니다. 이 작업은 해커의 계정에서 수행되며 작업의 이점을 얻습니다.

0 Comments
댓글쓰기 폼