2011-02-01 1 views
1

SO에서 본 것과 다른 곳에서 IIS는 JScript 엔진을 사용하여 서버 측 Javascript 코드를 실행할 수 있습니다. 사실, Classic ASP에서는 VBScript가 이러한 함수를 직접 호출 할 수 있으므로이 기능을 사용하는 것이 매우 쉽습니다. 그러나 .NET에서 나는 어떻게해야하는지 잘 모르겠습니다.내 ASP.NET 코드 숨김 내에서 기본 ASP의 javascript 함수를 호출하여 그 결과를 얻을 수 있습니까?

저는 Classic ASP로 작성된 웹 응용 프로그램을 .NET으로 변환하고 있습니다. 응용 프로그램은 javascript 함수를 사용하여 사용자 암호를 해시합니다. 결과는 데이터베이스에 저장된 해시에 대해 쿼리됩니다.

결과 코드가 계속 일치 할 수 있도록 내 codebehind에서이 javascript 함수를 계속 호출하고 싶습니다.

내가 본 온라인의 대부분은 JavaScript가 서버에서 실행되기를 원하기 때문에이 경우에는 작동하지 않는 RegisterStartupScript 함수를 사용하여 javascript를 호출하는 것과 관련이 있으며 이전에 자바 스크립트의 결과를 얻고 싶습니다. 나는 다시 게시한다. 이것이 가능한가?

+1

난 당신이 JScript.NET 공상 뭔가를 (http://en.wikipedia.org/wiki/JScript_.NET) 할 수있는 생각하지만, 더 나은 솔루션은 C#을에 은밀한 아마입니다. 이 구문은 (특히 C# 2.0 이상으로) 충분히 가깝기 때문에 쉽게 이해할 수 있습니다. 정말 복잡하다면 JLCA를 시험해 볼 수도 있습니다. http://www.microsoft.com/downloads/en/details.aspx?FamilyID=46bea47e-d47f-4349-9b4f-904b0a973174&displaylang=en – RMD

답변

1

다음은 간단한 로컬 "웹 서비스"호출을 사용하여 서버 측 JScript 함수를 래핑하는 방법입니다. 어딘가 관련 필요한 경우이 방법 (및 클래스를 추가하여 ASP.NET 응용 프로그램에서 DoHash.asp

<!-- #include file="passwordHasher.js" --> 
<% 
Dim password 
password = Request.Form("password") 
Response.Write HashPassword(password) 

%> 

:

파일 :

해싱 함수를 참조하는 JScript의 또는 ASP 스크립트를 추가

암호를 해시하는 데 필요한 응용 프로그램의 부분에서
public class HashWrapper 
{ 
    public static string HashPasswordFromJScript(string password) 
    { 
     string url = "https://mysite.com/DoHash.asp"; 

     string fields = "password=" + password; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.Method = "POST"; 

     using(Stream rs = request.GetRequestStream()) 
     { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using(BinaryWriter bw = new BinaryWriter(ms)) 
      { 
      bw.Write(Encoding.UTF8.GetBytes(fields)); 
      ms.WriteTo(rs); 
      ms.Flush(); 
      } 
     } 
     } 

     using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 
     if(response.StatusCode == HttpStatusCode.OK) 
     { 
      using(Stream rs = response.GetResponseStream()) 
      { 
      using (StreamReader rr = new StreamReader(rs)) 
      { 
       StringBuilder sb = new StringBuilder(); 
       int bufferSize = 1024; 
       char[] read = new Char[bufferSize]; 
       int count = rr.Read(read, 0, bufferSize); 

       while (count > 0) 
       { 
       sb.Append(read, 0, count); 
       count = rr.Read(read, 0, bufferSize); 
       } 
       return sb.ToString(); 
      } 
      } 
     } 
     return null; 
     } 
    } 
} 

은 전화 :

string hashedPassword = HashWrapper.HashPasswordFromJScript(password); 

귀엽지는 않지만 당신을 데려 갈 것입니다. 또한 사이트에서 SSL을 사용하여 트래픽을 암호화 할 수 있다고 가정합니다.

+0

그게 효과가 있습니다! 당신이 말하는 것처럼 귀엽지는 않지만 스크립트를 다시 작성하는 것만으로는 유일한 해결책 인 것 같습니다. – Slider345

-2

JavaScript 처리 클라이언트 측 동작을 사용하고 VB/C#에서 서버 측 호출을 처리하도록하십시오.

2

예 아니요.

당신은에 의해 ASP.NET 백엔드하지만이 결과를 얻기 위하여려고하고있는 유일한 방법을 통해 자바 스크립트 메서드를 호출 할 수있는 것은

그래서 당신이 때까지 기다릴 다음 통화를 시작할 수 있습니다 AJAX를 통해 다시 게시하는 것입니다 결과가 돌아오고 결과를 처리합니다.

이것은 원하는 것 일 수도 있고 아닐 수도 있습니다.

질문에 직접 답하려면 C# 코드 숨김에서 해시 함수를 다시 작성하여 호출하십시오. 기존 코드를 이식하지 않고 개선하십시오.

+0

그래, 두려웠 어. 올바르게 다시 작성하면 각 암호에 대해 생성 된 해시가 변경됩니다. – Slider345

+0

@ Slider345 함수를 블랙 박스로 취급하십시오. 암호가 해시에 매핑되는 방법을 확인하고 해당 구현을 복사하십시오. 너무 열심히해서는 안됩니다. – Raynos

1

가장 좋은 방법은 해시 기능을 두려워하지 않는 것입니다. 알고리즘을 이해하고 C#에서 다시 구현할 수 있다면. 몇 가지 테스트 케이스를 통해 두 가지를 통해 동일한 결과를 얻을 수 있는지 확인하십시오. 결국 많은 노력을 덜어줍니다. 고전적인 ASP는 페이지별로 페이지를 구문 분석하기 때문에

, 당신이 선택하고 당신이 당신의 페이지를 쓴 언어를 선택할 수 있습니다. 당신은 어떤 activescript 언어 (펄 하나 개의 시점에서 그런 식으로 사용할 수있었습니다!)

를 사용할 수 있습니다

a.닷넷 웹 애플 리케이션, 전체 애플 리케이션은 하나의 언어로해야합니다. 따라서 Jscript.Net을 사용하려면 함수에 대한 별도의 프로젝트가 필요합니다. 이 프로젝트는 웹 애플리케이션으로 가져 오는 어셈블리로 컴파일되거나 다른 웹 애플리케이션 일 수 있으며 2 요청 또는 웹 서비스를 통해 통신합니다. 어느 쪽이든, 그것은 많은 작업입니다.

사이먼

관련 문제