クラシックASPのWebサイトがあり、必要に応じてASP.NETに徐々に移行しています。
もちろん問題は、従来のaspとASP.NETがセッションを処理する方法です。最後の数時間をウェブの調査に費やした後、私は多くの記事を見つけましたが、他の記事よりも目立つものはありませんでした。
従来のaspおよびasp.netとの間でセッション変数を転送するためのベストプラクティスはありますか?セキュリティは必須であり、例を使った説明は大歓迎です。
クラシックASPのWebサイトがあり、必要に応じてASP.NETに徐々に移行しています。
もちろん問題は、従来のaspとASP.NETがセッションを処理する方法です。最後の数時間をウェブの調査に費やした後、私は多くの記事を見つけましたが、他の記事よりも目立つものはありませんでした。
従来のaspおよびasp.netとの間でセッション変数を転送するためのベストプラクティスはありますか?セキュリティは必須であり、例を使った説明は大歓迎です。
単一のセッション変数を従来のaspから.netサーバーサイドに渡す(クライアントからセッション値を隠す)ための単純なブリッジは、次のようになります。
ASP側:セッションを出力するためのaspページ。たとえば、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
%>
.net側で、その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;
}
}
私はajaxブリッジを使用しました(より良い用語が必要なため)。具体的には、すべてのセッション変数をGUIDを使用してデータベースに読み込む従来のaspページを使用し、クエリ文字列でGUIDを渡す.netページにリダイレクトします。 asp.netページは、指定されたGUIDのSQLから読み取り、それらの変数をセッションとして作成しました。
たとえば、従来のasp(擬似コードコード-アイデアを提供するためだけに、パラメータ化されたクエリを使用するなど):
'#### 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
次に、.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
私が言うように、これは非常に大まかな擬似コードですが、単純なバックグラウンドajax関数を使用してaspを呼び出してから、指定されたGUIDの.netページを呼び出すことができます。
これには、すべての変数と値をクライアントに公開しないという利点があります(postメソッドなどのように)。
それらは異なるセッションを使用するため、変数を自分で転送する方法を考案する必要があります。それらをCookieに含めるか、HTTP POST(つまり非表示のフィールドを持つフォーム)を介してasp.net側に送信することができます。
または、セッションストレージを使用してスクラップし、ユーザー/セッションごとにすべてをデータベースに貼り付けてから、上記の提案のいずれかを使用して、従来のASPからASP.NETにセッションキーを渡すこともできます。これはあなたが車輪の再発明をしているように聞こえますが、これはあなたがそれを回避できない場合の1つかもしれません。
私はその正確な行動をするウェブサイトを持っています。秘密は、asp関数response.redirectで中間ページを使用することです
<%
client_id = session("client_id")
response.redirect "aspx_page.aspx?client_id=" & client_id
%>
これは、従来のaspセッション変数client_idをプルしてaspxページに渡す例です。aspxページはそこから処理する必要があります。
これは、従来のaspページの上部にある必要があり、上記のタイプのHTMLはありません。IISはサーバー上でこれを処理し、データをクライアントマシンに送信せずに、クエリ文字列が添付されたaspxページにリダイレクトします。とても速いです。
他の誰かが助けを求めてここでつまずいた場合、別の可能なオプションはクッキーを使用することです。Cookieの利点は、妥当な量のデータを保存し、そのデータを.Netアプリケーション(または別のWebアプリケーション)に保持できることです。Cookieは簡単に操作または偽造される可能性があるため、Cookieの公開にはセキュリティ上のリスクがあります。機密データをCookieで送信することはありません。ここで、Cookieは、テーブルからデータを取得するために使用できる一意の識別子のみを格納しています。
アプローチ:
ユーザーの一意の識別子、セッションID、および現在のタイムスタンプを組み合わせたSHA256ハッシュを使用しました。ハッシュは数分間のみ有効であり、読み取ると期限切れになります。有効期限が切れる前に有効なハッシュを推測する必要がある攻撃者のウィンドウを制限するという考え方です。