천객만래 [千客萬來] (It has an interminable succession of visitors)

현재 참여하고 있는 프로젝트를 하면서 SSL을 적용하다 보니 로그인 처리에서 문제가 발생했습니다.

 

일반로그인 처리는 해당페이지의 비하인드코드에서 하면 되지만, SSL을 적용하려면 로그인 처리 페이지를 https://로 접근해야 합니다.

 

위와 같은 경우 Get방식으로 로그인정보를 보내어 처리하면 무리는 없지만

Post방식으로 할 경우 단순히 Form태그의 Action만 바꿔서는 안됩니다.

 

보통 aspx페이지에서는 자체 페이지마다 viewstate값을 가지고 있는 hidden 컨트롤이 있습니다.

 

<input type="hidden" name="__VIEWSTATE" value="dDw3NjMwDYbDxpP..." />

 

이 값을 post방식으로 해서 다른페이지에 보내는 경우 다음과 같은 에러가 발생합니다.

에러 내용을 보시면 알겠지만 machinekey 구성을 수정하라고 하는군요...

 

System.Web.HttpException: Authentication of viewstate failed. 

1) If this is a cluster, edit <machineKey> configuration so all servers use the same validationKey and validation algorithm.  AutoGenerate cannot be used in a cluster. 

2) Viewstate can only be posted back to the same page. 

3) The viewstate for this page might be corrupted. -

--> System.Web.HttpException: 데이터가 유효한지 확인할 수 없습니다.

 

수정하시기가 구찮으시다면.. 아래 소스코드 처럼 __VIEWSTATE의 값은 넘기지 않도록 합니다.

 

<SCRIPT language="javascript">
<!--
function LoginCheck( form )
{
   form.__VIEWSTATE.disabled = true;

   // post방식으로 현재페이지의 컨트롤값을 다른페이지로 그대로 넘기는 되는경우

   // aspx에서는 클라이언트에서 접근할수 있는 아이디값이 컴파일후 바뀐다는것을

   // 유념하셔야 합니다. 아래 처럼 별도의 hidden필드를 만들어서 입력한 값이나

   // 클라이언트 아이디를 넘겨서 다음 페이지에서 정상적으로 값을 받을수 있도록 합니다.
   form.Uid.value = idBox.value;
   form.Pwd.value = pwdBox.value;


   var submitUrl = "https://<%=Request.Url.Host%>/LoginProcess.aspx" ;

   form.action = submitUrl;


   form.submit();
   return true;
}
//-->
</SCRIPT>

출처 : http://blog.naver.com/tear230/100014257847

 
Posted by SB패밀리


__doPostBack()Page.GetPostBackEventReference()함수


ASP.NET 개발을 할 때 submit() 기능을 사용하려고 하면 에러가 발생하는 경우가 있다.
이럴 때 버튼 이벤트 등을 이용해서 자바스크립트로 Behind code(.cs)의 메서드를 실행해야할 때가 발생한다.

이럴 경우 보통은 aspx 화일에서 자바스크립트로 __doPostBack() 메서드를 정의해서 사용하면 가능한다.
하지만, 이보다 더 좋은 방법이 있다.

__doPostBack() 메서드는 .net에서 자동 생성하는 부분으로, 개발자가 별도로 작성하여도 바뀔 가능성이 있다.
또한, .net에서 자동으로 생성하지 않는 경우도 발생한다.

자바스크립트에서 behind code의 메서드를 실행하고 싶을 때는 아래와 같은 방법을 권한다.

<%= Page.GetPostBackEventReference( btnOk2 ) %>

이는 postback이 발생하는 WebForm Control을 매개변수로 넘겨주면, 자동으로 __doPostBack()을 생성해 준다.

ex)
[Page.aspx]
btnOk -> HTML Input 컨트롤 - visible

<script language="javascript">
    function btnOkClick()
    {
        <%= Page.GetPostBackEventReference( btnOk2 ) %>
    }
</script>

 <input type="button" onclick="btnOkClick()">

 

[Page.aspx.cs]
btnOk2 -> WebForm Button 컨트롤 - invisible

private void btnOk2_Click(...)
{
    ...
}


other ex)
[pageB.aspx]

<script language="javascript">
    function Dosomething()
    {
 // ...
        <%= Page.GetPostBackEventReference( btnOk ) %>
 // 여기에 __doPostBack('btnOk', ''); 를 사용해도 가능하다.
    }
</script>

 <asp:Button ID="btnOK" runat="server" OnClick="btnOk_Click" />


[pageB.aspx.cs]

protected void btnOk_Click(object sender, EventArgs e)
{
    // ...
}


참고 :  Page.GetPostBackClientHyperlink()

HyperLink나 LinkButton의 출력결과처럼 a tag에서 __doPostBack() 메서드를 호출할 수 있도록 javascript: 문자가 앞에 붙게 됩니다.

Posted by SB패밀리

참고: Post data to other Web pages with ASP.NET 2.0

ASP.NET 페이지는 기본적으로 PostBack 메쏘드를 활용한다. [form action="ACTION_PAGE"][/form] 형태와 같이 폼 안에 있는 action 속성에 지정한 페이지를 가지고 페이지에 할당된 변수들을 넘기게 되는데, 이를 무조건 자기자신으로 세팅하는 것이 ASP.NET의 세계라고나 할까... 그래서, 다른 페이지로 변수들을 넘길 땐 몇가지 방법이 있다.

  • 세션에 값들을 저장한 후 넘어간 페이지에서 받아 쓴다.
  • Server.Transfer() 메쏘드를 이용한다.
  • Button.PostBackUrl 속성을 이용한다.

첫번째 방법이 가장 일반적이지 싶다. 일단 해당 페이지에서 버튼을 클릭했을 때 필요한 값들을 세션에 저장해 놓고, Response.Redirect() 메쏘드로 다음 페이지로 넘어간 다음에 거기서 세션값을 불러와 쓰는 방법이다. 가장 무난하다고나 할까... 근데, 무슨 이유에서건 세션이 날아가면? 에러지 머.

두번째 방법은 Response.Redirect() 메쏘드와는 조금 다르다. Response.Redirect() 메쏘드는 페이지만 바꿔주는 것으로 이전 페이지의 QueryString 이라든가 Form 값들이 페이지 이동중에 없어진다. 따라서, 리디렉션 URL에 QueryString 값을 포함시켜야만 하는 반면에 Server.Transfer() 메쏘드는 QueryString 값과 Form 값을 모두 유지한다. 따라서, Request.Form[parametre] 형태로 이전 페이지에서 저장된 값을 당근 뽑아올 수 있다. 요게 Server.Transfer() 메쏘드의 장점.

마지막으로 Button.PostBackUrl 속성을 세팅하게 되면, 기본적으로 포스트백을 실행시키고 나서 알아서 Button.PostBackUrl 에 세팅한 페이지로 자동으로 넘겨준다. 그리고 거기서 Request.Form[parametre] 형태로 값을 뽑아 쓸 수 있다.

또한가지, 두번째와 세번째 방법의 장점이라면 Page.PreviousPage 속성을 이용해 이전 페이지의 콘트롤에 접근이 가능하다는 것이다. 예를 들어보쟈.

pageA.aspx

[html]
	[head][/head]
	[body]
		[form ID="frm" runat="server"]
			[asp:TextBox ID="tbxGivenName" runat="server" Text="Justin" /]
			[asp:Button ID="btnSubmit" runat="server" Text="Go" PostBackUrl="pageB.aspx" /]
		[/form]
	[/body]
[/html]
pageB.aspx

[script runat="server"]
	protected void Page_Load(object sender, EventArgs e)
	{
		Page pp = this.PreviousPage;
		string givenName = ((TextBox)pp.FindControl("tbxGivenName")).Text;
	}
[/script]

요런 식으로 pageA.aspx 에서 pageB.aspx 로 넘어가면서 pageB.aspx 에서 pageA.aspx 에 들어있는 콘트롤들에 접근이 가능한 셈이다.

출처: http://blog.daum.net/justinsays/8312599

Posted by SB패밀리