2012-06-28 42 views
9

Chúng tôi có một trang web trong asp cổ điển mà chúng tôi đang dần dần di chuyển sang ASP.NET khi cần thiết.ASP cho ASP.NET Session biến

Vấn đề của khóa học là cách cổ điển asp và ASP.NET xử lý Phiên. Sau khi dành vài giờ nghiên cứu trên web, tôi đã tìm thấy nhiều bài viết, nhưng không phải là một bài viết nổi bật so với các bài viết khác.

Có cách nào tốt nhất để chuyển các biến phiên từ và sang asp và asp.net cổ điển? An ninh là phải và bất kỳ lời giải thích với các ví dụ được nhiều đánh giá cao.

+0

Tôi nên thực hiện vào cuối tuần này với giải pháp phù hợp nhất với nhu cầu của chúng tôi. Tôi cũng sẽ đề cập đến một số phương pháp khác. Được đăng. – PsychoDUCK

Trả lời

5

Một cây cầu đơn giản để vượt qua một biến phiên duy nhất từ ​​asp cổ điển để .net serverside (ẩn sessionvalue của bạn từ máy khách), sẽ là:

  • Trên ASP cuối: Một trang asp để đầu ra phiên của bạn, gọi nó là ví dụ asp2netbridge.asp

    <% 
    'Make sure it can be only called from local server ' 
    if (request.servervariables("LOCAL_ADDR") = request.servervariables("REMOTE_ADDR")) then 
        if (Request.QueryString("sessVar") <> "") then 
         response.write Session(Request.QueryString("sessVar")) 
        end if 
    end if 
    %> 
    
  • Trên đầu .net, một cuộc gọi từ xa đến trang asp đó.:

    private static string GetAspSession(string sessionValue) 
    { 
        HttpWebRequest _myRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://yourdomain.com/asp2netbridge.asp?sessVar=" + sessionValue)); 
        _myRequest.ContentType = "text/html"; 
        _myRequest.Credentials = CredentialCache.DefaultCredentials; 
        if (_myRequest.CookieContainer == null) 
         _myRequest.CookieContainer = new CookieContainer(); 
        foreach (string cookieKey in HttpContext.Current.Request.Cookies.Keys) 
        { 
         ' it is absolutely necessary to pass the ASPSESSIONID cookie or you will start a new session ! ' 
         if (cookieKey.StartsWith("ASPSESSIONID")) { 
          HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieKey.ToString()]; 
          _myRequest.CookieContainer.Add(new Cookie(cookie.Name, cookie.Value, cookie.Path, string.IsNullOrEmpty(cookie.Domain) 
           ? HttpContext.Current.Request.Url.Host 
           : cookie.Domain)); 
         } 
        } 
        try 
        { 
         HttpWebResponse _myWebResponse = (HttpWebResponse)_myRequest.GetResponse(); 
    
         StreamReader sr = new StreamReader(_myWebResponse.GetResponseStream()); 
         return sr.ReadToEnd(); 
        } 
        catch (WebException we) 
        { 
         return we.Message; 
        } 
    } 
    
+0

Thats làm thế nào tôi đã kết thúc mã hóa nó. Tôi quên đăng câu trả lời của mình. – PsychoDUCK

+0

giá trị sessionValue ở đây là gì? – Sajeetharan

+0

@Sajeetharan Không chắc chắn câu hỏi của bạn là gì .. SessionValue là bất kỳ biến phiên nào bạn muốn chia sẻ, do đó, bất kỳ tham số chuỗi nào – AardVark71

0

Họ sử dụng các phiên khác nhau, vì vậy, bạn sẽ cần phải tự mình đưa ra một số cách để chuyển chính các vars. Bạn có thể đưa chúng vào cookie hoặc gửi chúng qua HTTP POST (ví dụ: biểu mẫu có trường ẩn) cho phía asp.net. Ngoài ra, bạn có thể sử dụng lưu trữ phiên và dán mọi thứ vào cơ sở dữ liệu cho mỗi người dùng/phiên, sau đó chỉ cần chuyển khóa phiên từ ASP cổ điển sang ASP.NET thông qua một trong các đề xuất ở trên. Tôi biết điều này nghe có vẻ như bạn đang tái phát minh ra bánh xe, nhưng đây có thể là một trong những trường hợp mà bạn không thể vượt qua nó.

+0

Tôi muốn bài đăng này xem xét tất cả các giải pháp và xác định hoặc tạo ra giải pháp 'tốt nhất', giữ an toàn trong tâm trí. Tại sao một người tốt hơn người kia. Rõ ràng là dựa trên một số kịch bản nhất định sẽ tốt hơn, nhưng không có câu trả lời rõ ràng mà tôi có thể tìm thấy trên web. – PsychoDUCK

+0

Không có câu trả lời dứt khoát cho câu hỏi này và sẽ không thể gắn nhãn một câu trả lời là "tốt nhất", vì đó là một thuật ngữ rất chủ quan. Bạn sẽ phải làm một số nghiên cứu và xác định những gì hoạt động tốt nhất cho nhu cầu của bạn. Đây chỉ là một số ý tưởng, và bạn nên nghiên cứu chúng dựa trên nhu cầu của bạn. –

+0

Mặc dù để cân nhắc an ninh, tôi sẽ tránh gửi các vars cho khách hàng (thông qua cookie, các trường biểu mẫu ẩn, v.v.). Hãy xem xét một giải pháp tương tự như đoạn thứ hai của tôi, nơi bạn lưu trữ các vars nội bộ, và gửi một định danh cho khách hàng. –

3

Tôi đã sử dụng cầu ajax (để muốn có cụm từ tốt hơn), cụ thể là trang asp cổ điển đọc tất cả các phiên vars vào cơ sở dữ liệu bằng guid, sau đó chuyển hướng đến trang .net truyền guid chuỗi truy vấn, trang asp.net đọc từ sql cho guid đã cho và tạo ra những vars như phiên.

Ví dụ, trong asp cổ điển (mã giả - chỉ để cung cấp cho bạn một ý tưởng, sử dụng các truy vấn parameterised trong máy của bạn vv):

'#### Create GUID 
Dim GUID 'as string 
GUID = CreateWindowsGUID() '#### Lots of methods on http://support.microsoft.com/kb/320375 

'#### Save session to sql 
For Each SessionVar In Session.Contents 
    db.execute("INSERT INTO SessionBridge (GUID, Key, Value) VALUES ('" & GUID & "', '" & SessionVar & "', '" & session(SessionVar) & "')") 
Next 

Sau đó, trong một trang .net:

'#### Fetch GUID 
Dim GUID as string = Request.QueryString("GUID") 
session.clear 

'#### Fetch from SQL 
db.execute(RS, "SELECT * FROM SessionBridge WHERE GUID = '" & GUID & "'") 
For Each db_row as datarow in RS.rows 
    Session(db_row("Key")) = db_row("Value") 
Next 

Như tôi đã nói, đây là mã giả rất thô, nhưng bạn có thể gọi asp với một hàm ajax nền đơn giản, sau đó gọi trang .net cho GUID đã cho.

Điều này có lợi thế là không phơi bày tất cả các biến và giá trị của bạn cho ứng dụng khách (như các phương pháp đăng bài, v.v.).

+0

Điều này rất giống với những gì tôi nghĩ là một giải pháp tốt. Nhưng đã nhầm lẫn dựa trên một bài viết của Microsoft mà đã làm một cách tiếp cận tương tự mà yêu cầu bảo mật DLL được đăng ký và vv Tôi không hiểu tại sao đó là cần thiết. Đây là liên kết http://msdn.microsoft.com/en-us/library/aa479313.aspx. Bất kỳ ý tưởng tại sao tất cả các công việc phụ đề cập trong bài viết MSDN là có? Nếu nó là cần thiết ở tất cả? – PsychoDUCK

+1

@PsychoDUCK Tôi nghĩ rằng phiên bản của Microsoft tổng quát hơn. Bạn có thể lưu trữ bất kỳ đối tượng nào trong một biến phiên (không chỉ là chuỗi), do đó, có thể đoán giải pháp của họ có thể xử lý điều đó. Nhưng nếu bạn chỉ lưu trữ chuỗi trong biến phiên, thì điều này hoạt động tốt (chỉ cần đảm bảo giá trị phiên không có dấu ngoặc kép hoặc hướng dẫn được đăng ở đây có thể sẽ bị hỏng) – Rodolfo

0

Tôi có một trang web thực hiện hành động chính xác đó. Bí mật là sử dụng trang trung gian có hàm asp response.redirect

<% 
client_id = session("client_id") 
response.redirect "aspx_page.aspx?client_id=" & client_id 
%> 

Đây là ví dụ để kéo biến phiên kinh nghiệm asp client_id và chuyển nó tới trang aspx. Trang aspx của bạn sẽ cần phải xử lý nó từ đó.

Điều này cần phải ở trên cùng của trang asp cổ điển, không có HTML thuộc bất kỳ loại nào ở trên. IIS sẽ xử lý điều này trên máy chủ và chuyển hướng đến trang aspx với chuỗi truy vấn đính kèm, mà không gửi dữ liệu đến máy khách. Nó rất nhanh.

+2

"... mà không gửi dữ liệu đến máy khách" - Response.Redirect gửi url chứa client_id đến máy khách. – Joe

+0

@joe có thể 'Server.Transfer' làm việc ở đây thay vì hoặc tôi thiếu một cái gì đó hiển nhiên? –

0

Trong trường hợp bất cứ ai khác tình cờ ở đây tìm kiếm một số giúp đỡ, một lựa chọn có thể là sử dụng các tập tin cookie. Lợi ích của cookie là bạn có thể lưu trữ lượng dữ liệu hợp lý và sau đó lưu dữ liệu đó vào ứng dụng .Net của bạn (hoặc một ứng dụng web khác). Có những rủi ro bảo mật khi lộ cookie vì dữ liệu đó có thể dễ dàng bị thao túng hoặc giả mạo. Tôi sẽ không gửi dữ liệu nhạy cảm trong cookie. Ở đây, cookie chỉ lưu trữ một mã định danh duy nhất có thể được sử dụng để lấy dữ liệu từ một bảng.

Cách tiếp cận:

  1. Grab các dữ liệu phiên bạn cần từ trang asp cổ điển của bạn. Lưu trữ dữ liệu này trong bảng cùng với băm duy nhất và dấu thời gian.
  2. Lưu giá trị của hàm băm trong một cookie ngắn.
  3. Chuyển hướng đến bất kỳ trang nào bạn cần truy cập và đọc hàm băm trong cookie.
  4. Kiểm tra xem hàm băm trong cookie chưa hết hạn trong cơ sở dữ liệu hay chưa. Nếu nó hợp lệ, hãy gửi lại dữ liệu bạn cần đến trang của bạn và sau đó hết hạn băm để nó không thể được sử dụng lại.

Tôi đã sử dụng giá trị băm SHA 256 là kết hợp giữa số nhận dạng duy nhất của người dùng, ID phiên và dấu thời gian hiện tại. Hàm băm chỉ hợp lệ trong vài phút và hết hạn khi đọc. Ý tưởng là giới hạn cửa sổ cho kẻ tấn công, những người sẽ cần phải đoán một băm hợp lệ trước khi nó hết hạn.

Các vấn đề liên quan