またASPについて話します.NET 7-アプリケーション間、サーバ間のフォーム検証

6672 ワード

多くの場合、同じサーバ上の2つの異なるアプリケーションで同じForms検証情報を共有したいと考えています.つまり、1つのアプリケーションが検証に合格した後、他のアプリケーションがこの検証状態を共有することができ、再ログインせずに単一のログインを実現することができます.
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 }