본문 바로가기
[ Web ]/ASP.NET

[ASP.NET/C#] Viewstate MAC에 대한 유효성 검사가 실패했습니다.

by 관이119 2013. 1. 18.


출처 - http://mrbongdal.tistory.com/19


A라는 페이지의 form의 내용을 post방식으로 B라는 페이지에 submit시킬경우 라던지

웹팜 구조에서 포스트백이 일어날때 원본 viewstate를 다른서버에서 해석하지 못해서 발생하는 오류입니다.


포스트백동안 ViewState값은 특정한 키를 사용하여 암호화 -> 해독 과정을 거치게 되는데 

이때 사용하는 키 값이 서로 다르게 설정되어있을경우 이러한 오류가 발생하게 됩니다.


이를 해결하기위해서는 해당 내용을 넘겨받을 페이지의 페이지 선언문 또는 web.config 파일을 열어서 페이지 선언부에

enableViewStateMac = "false" 로 해주시거나 모든 웹서버의 validationKey값을 동일하게 설정해야합니다.


※ validationKey값 가져오기

VisualStudio 를 이용 C# 콘솔 응용프로그램 프로젝트 선택

프로젝트 이름은 적당히 정하여서 프로젝트를 생성한뒤 아래와같이 코딩합니다.


using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace Crypto
{
    public class KeyCreator
    {
        public static void Main(string[] args)
        {
            string[] commandLineArgs = System.Environment.GetCommandLineArgs();

            string decryptionKey = CreateKey(Convert.ToInt32(commandLineArgs[1]));
            string validationKey = CreateKey(Convert.ToInt32(commandLineArgs[2]));

            //Console.WriteLine("<machinekey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\">", validationKey, decryptionKey);

            FileStream fs = new FileStream("key.txt", FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs); sw.WriteLine("<machinekey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\">", validationKey, decryptionKey); sw.Close(); fs.Close(); } static String CreateKey(int numBytes) { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] buffer = new byte[numBytes]; rng.GetBytes(buffer); return BytesToHexString(buffer); } static String BytesToHexString(byte[] bytes) { StringBuilder hexString = new StringBuilder(64); for (int count = 0; count < bytes.Length; count++) { hexString.Append(string.Format("{0:X2}", bytes[count])); } return hexString.ToString(); } } }


이후 해당 프로젝트를 빌드한뒤 커맨드창을 띄운뒤 해당 프로젝트 폴더의 bin > Debug 폴더로 이동




위와 같이 진행하시면 되겠습니다.



-----------------------------------------------------------------------------------------------------------------------------

출처 - http://blog.naver.com/kyora226?Redirect=Log&logNo=30024493741

페이지선언부를 다음과 같이 선언
<%@Page enableViewStateMac="False"%>


-----------------------------------------------------------------------------------------------------------------------------

출처 - http://exterminate.tistory.com/4

windows2008에서는 하나의 서버에 2개이상의 웹사이트를 구동시

세션값이 공유되지 않는 현상이 발생하였다.

제목과 같이 viewstate MAC에 대한 유효성 검사가 실패했습니다 

라는 에러가 발생시 다른방법으로 해결할수 있으나 해결한다 하여도 페이지는 표시되나 세션이 유지되

지 않는 현상이 발생하였다. 

해결방법은 web.config파일에 machinekey값을 추가를 해주어서 키값을 지정하여 해결을 하였다.

첨부파일을 웹페이지로 구동하여 machinekey값을 생성할수 있으며 web.config의 <system.web>부

분에 machinekey값을 삽입해주면 된다.

키값은
<machineKey 
validationKey="792EF55E7788930FFF6B554523A05048A8B2A5B5D884C53A27BE245050F4C77DE2058FA5BE8CBE992EC6F3E3C25C545213344658A18D524022760727D73323DD"
decryptionKey="471EAC120BF8CBA68B4416C71C8CEB44E94704F12C77C432F2672FCA6B320208"
validation="SHA1" decryption="AES"
/>
와 같은 형식으로 생성이되며 web.config에 삽입해주어 해결을 하였다.


댓글