またASPについて話します.NET 7-アプリケーション間、サーバ間のフォーム検証
6672 ワード
多くの場合、同じサーバ上の2つの異なるアプリケーションで同じForms検証情報を共有したいと考えています.つまり、1つのアプリケーションが検証に合格した後、他のアプリケーションがこの検証状態を共有することができ、再ログインせずに単一のログインを実現することができます.
Forms認証を使用して生成されたクッキーは暗号化されており、プログラムごとに独立した復号と検証コードがデフォルトで生成されるため、暗号化されたクッキーを異なるアプリケーション間で共有することは難しい.共有を可能にするには、プロファイル(サーバ側)から暗号化キーと検証コードを手動で指定する必要があります.
machineKeyのデフォルト設定は次のとおりです.
Ødecryptionプロパティ:Forms認証の下でクッキーを暗号化するアルゴリズムを指定します.値はAuto、AESまたは3 DESで、デフォルトはAutoです(ASP.NETはWebサーバの性能に応じて最適な暗号化アルゴリズムを選択します).
Øvalidationプロパティ:AES、MD 5、SHA 1、3 DESの値をとることができる検証クッキーのHashと暗号化アルゴリズムを指定します.
ØdescryptionKey属性とvalidationKey属性:それぞれ検証クッキーを暗号化する鍵とHash演算の検証コードを表す.
なお、上記構成では、
ØAutoGenerate:ASPを表す.NETは、ランダム鍵を生成し、LSA(ローカルスタンドアロン)に格納する
ØIsolateAppsは、Webサーバの各アプリケーションに固有の鍵を作成することを示します.
サーバ側Webを書き換えることができます.configの設定は、前述のデフォルト構成のdecryptionKeyとvalidationKeyの2つのプロパティのIsolateAppsを削除すればよい.つまり、この設定はアプリケーションごとに独立していないことを示します.
ヒント:
サーバー側web.configのパス:
C:\Windows\Microsoft.NET\Framework(64)\[version]\CONFIG\web.config
もう1つの場合、同じクッキー暗号化を1つのウェブfarmなどの異なるウェブサーバ上のアプリケーションで共有したい場合.decryptionKeyとvalidationKeyのプロパティ値を手動で生産し、サーバ間で一貫性を保つ必要があります.
AESアルゴリズムは64ビットの16進数文字ランダムシーケンスを必要とし、SHA 1アルゴリズムは128ビットの16進数ランダムシーケンスを使用し、このようなコードによって必要なランダムシーケンスを生成することができる.
2台のサーバ上の同じアプリケーションで同じ認証暗号化情報を共有したい場合は、machineKeyの設定をアプリケーション独自のwebに置く必要があります.configでは、またcookieは設計上ドメイン間検証として使用できないため、1つのWebサーバ上の異なるアプリケーションでも、複数のサーバ上の同じアプリケーションでも同じドメイン(すなわち、2つのアプリケーションapp 1.sample.comとapp 2.sample.comが同じドメイン)で前述した方法を使用することが有効である.
ASP.NETはドメイン間の検証共有にもソリューションを提供しています.cookieの代わりにクエリー文字列を介して検証証明書を渡します.Webでconfigでは、アプリケーションがクエリー文字列を介して検証認証情報を伝達し、検証情報のドメイン間共有を実現できるように設定します.
クッキーに保存されていた認証情報をUrlに追加する方法も簡単です.つまり、通常のクエリ文字列を渡す方法です.
例えば、HyperLinkがあります.
C#コードを使用して、証明書を追加します.
Forms認証を使用して生成されたクッキーは暗号化されており、プログラムごとに独立した復号と検証コードがデフォルトで生成されるため、暗号化されたクッキーを異なるアプリケーション間で共有することは難しい.共有を可能にするには、プロファイル(サーバ側)から暗号化キーと検証コードを手動で指定する必要があります.
machineKeyのデフォルト設定は次のとおりです.
1 <machineKeydecryption="Auto"validation="SHA1" ecryptionKey="Auto Generate, IsolateApps"validationKey="Auto Generate, IsolateApps"/>
Ødecryptionプロパティ:Forms認証の下でクッキーを暗号化するアルゴリズムを指定します.値はAuto、AESまたは3 DESで、デフォルトはAutoです(ASP.NETはWebサーバの性能に応じて最適な暗号化アルゴリズムを選択します).
Øvalidationプロパティ:AES、MD 5、SHA 1、3 DESの値をとることができる検証クッキーのHashと暗号化アルゴリズムを指定します.
ØdescryptionKey属性とvalidationKey属性:それぞれ検証クッキーを暗号化する鍵とHash演算の検証コードを表す.
なお、上記構成では、
ØAutoGenerate:ASPを表す.NETは、ランダム鍵を生成し、LSA(ローカルスタンドアロン)に格納する
ØIsolateAppsは、Webサーバの各アプリケーションに固有の鍵を作成することを示します.
サーバ側Webを書き換えることができます.configの設定は、前述のデフォルト構成のdecryptionKeyとvalidationKeyの2つのプロパティのIsolateAppsを削除すればよい.つまり、この設定はアプリケーションごとに独立していないことを示します.
ヒント:
サーバー側web.configのパス:
C:\Windows\Microsoft.NET\Framework(64)\[version]\CONFIG\web.config
もう1つの場合、同じクッキー暗号化を1つのウェブfarmなどの異なるウェブサーバ上のアプリケーションで共有したい場合.decryptionKeyとvalidationKeyのプロパティ値を手動で生産し、サーバ間で一貫性を保つ必要があります.
AESアルゴリズムは64ビットの16進数文字ランダムシーケンスを必要とし、SHA 1アルゴリズムは128ビットの16進数ランダムシーケンスを使用し、このようなコードによって必要なランダムシーケンスを生成することができる.
1 string GetKey(int length)
2 {
3 byte[] buffer = new byte[length / 2];
4 RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
5 provider.GetBytes(buffer);
6 StringBuilder builder = new StringBuilder(length);
7 for (int i = 0; i < buffer.Length; i++)
8 {
9 builder.Append(string.Format("{0:X2}", buffer[i]));
10 }
11 return builder.ToString();
12 }
2台のサーバ上の同じアプリケーションで同じ認証暗号化情報を共有したい場合は、machineKeyの設定をアプリケーション独自のwebに置く必要があります.configでは、またcookieは設計上ドメイン間検証として使用できないため、1つのWebサーバ上の異なるアプリケーションでも、複数のサーバ上の同じアプリケーションでも同じドメイン(すなわち、2つのアプリケーションapp 1.sample.comとapp 2.sample.comが同じドメイン)で前述した方法を使用することが有効である.
ASP.NETはドメイン間の検証共有にもソリューションを提供しています.cookieの代わりにクエリー文字列を介して検証証明書を渡します.Webでconfigでは、アプリケーションがクエリー文字列を介して検証認証情報を伝達し、検証情報のドメイン間共有を実現できるように設定します.
1 <authentication mode="Forms">
2 <forms enableCrossAppRedirects="true"/>
3 </authentication>
クッキーに保存されていた認証情報をUrlに追加する方法も簡単です.つまり、通常のクエリ文字列を渡す方法です.
例えば、HyperLinkがあります.
1 <asp:HyperLink ID="lnkToOtherDomain" NavigateUrl="http://www.otherdomain.com/secret.aspx" runat="server" />
C#コードを使用して、証明書を追加します.
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 string cookieName = FormsAuthentication.FormsCookieName;
4 string cookieValue = FormsAuthentication.GetAuthCookie(User.Identity.Name, false).Value;
5 lnkToOtherDomain.NavigateUrl += string.Format("?{0}={1}", cookieName, cookieValue);
6 }