2011-02-01 29 views
1

從我在SO和其他地方看到的,IIS可以使用它的JScript引擎運行服務器端JavaScript代碼。事實上,在傳統ASP中,看起來相當容易,因爲VBScript可以直接調用這些函數。但是,在.NET中,我不知道如何處理。我可以在我的ASP.NET代碼隱藏內部調用一個javascript函數(來自傳統ASP)並獲得它的結果嗎?

我正在將使用經典ASP編寫的Web應用程序轉換爲.NET。該應用程序使用JavaScript函數來散列用戶密碼。查詢結果是針對存儲在數據庫中的散列進行查詢的。

我想繼續從我的代碼隱藏中調用此JavaScript函數,以便生成的哈希將繼續匹配。

我在網上看到的很多東西都涉及到使用RegisterStartupScript函數調用javascript,在這種情況下這不起作用,因爲我想讓javascript在服務器上運行,並且我想要在之前獲得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 2011-02-01 16:29:13

回答

1

這是一種使用簡單的本地「web服務」調用來包裝服務器端JScript函數的方法。

添加JScript或ASP腳本引用散列函數:

文件:DoHash.asp

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

%> 

在ASP.NET應用程序中,如果有必要的地方相關添加此方法(和類:

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加密流量。

-2

嘗試使用JavaScript處理客戶端行爲並讓VB/C#處理服務器端調用。

2

是和否。

你可以通過ASP.NET後端通過,但你會得到結果的唯一方法調用JavaScript的方法是將它張貼回來通過AJAX

這樣你就可以開始通話,然後等着,直到結果返回並處理結果。

這可能是也可能不是你想要的。

要直接回答您的問題,請在C#代碼隱藏中重寫哈希函數並在此處調用它。不要只移植遺留代碼,改進它。

+0

是的,我害怕那麼,正確地重寫它可能會改變爲每個密碼生成的哈希值。 – Slider345 2011-02-01 17:11:33

+0

@ Slider345將該功能視爲黑匣子。瞭解它如何將密碼映射到散列並複製該實現。不應該太難。 – Raynos 2011-02-01 17:13:20

1

要做的最好的事情就是不要害怕散列函數。如果你能算出算法並用C#重新實現它。提出一些測試用例來檢查你是否通過兩種方法獲得了相同的結果。它最終會爲你節省很多努力。

因爲傳統的ASP解析在頁逐頁的頁面,你可以挑選你在寫什麼語言你的網頁,你可以使用任何activescript語言(perl的是可用的方式在一個點!)

在a。網絡應用程序,整個應用程序需要使用一種語言。所以要使用Jscript.Net,你需要爲你的函數提供一個單獨的項目。該項目可以編譯爲彙編程序,您可以將其導入到您的Web應用程序,也可以是另一個Web應用程序,並通過請求或Web服務在2之間進行通信。無論哪種方式,這是很多工作。

西蒙

相關問題