サブプロジェクトを使用して ASP.NET MVC 4 にアプリケーションを実装していますが、これらのアプリケーションで同じログインを共有する必要があります (1 つのアプリケーションにログインするだけで、サブプロジェクトにログインする必要はありません)。
通常、webForms ではマシン キーを使用して実行しますが、MVC 4 ではそれが機能しなくなりました。MVC 4 でこれに対する新しい解決策はありますか?
サブプロジェクトを使用して ASP.NET MVC 4 にアプリケーションを実装していますが、これらのアプリケーションで同じログインを共有する必要があります (1 つのアプリケーションにログインするだけで、サブプロジェクトにログインする必要はありません)。
通常、webForms ではマシン キーを使用して実行しますが、MVC 4 ではそれが機能しなくなりました。MVC 4 でこれに対する新しい解決策はありますか?
Forms authentication
はフォーム認証を介して行われるため、ticket
すべてのアプリケーションが 1 つの認証チケットを共有する場合、ユーザーは一度だけログインする必要があるため、シングル サインオンになります。これらの URL を持つ 2 つのアプリケーションがあるとします。
http://public.mysite.com/app1/default1.aspx
http://public.mysite.com/app2/default2.aspx
ご覧のとおり、これらは基本的に同じサブドメインの下にある 2 つの仮想ディレクトリです。 app1public.mysite.com.
によって書き込まれた Cookieはapp2によって表示され、その逆も同様です。
ただし、これは、ユーザーがapp1にログインすると、自動的にapp2にログインされるという意味ではありません。その理由は、既定では、各 ASP.NET アプリケーションが独自の暗号化キーを使用してフォーム認証チケットと Cookie を作成するためです。したがって、 app1 によって書き込まれた Cookie は、 app2 に表示されていても、 app2 によって正常に読み取ることができません。
2 つのアプリケーションが互いの認証チケットと Cookie を認識できるようにするにはどうすればよいでしょうか?
実際、ASP.NET では非常に単純です。実行する必要があるのは、web.config ファイルの要素の設定を変更することだけです。machineKey のデフォルト設定は次のとおりです。
<machineKey
validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
validation="SHA1"
decryption="Auto"
/>
これらの設定により、.NET フレームワークは自動生成された を使用して、認証チケットvalidationKey
とdecrytionKey
Cookie を作成します。各アプリケーションは異なるキーを使用します。複数のアプリケーションで同じ認証チケットと Cookie を共有するには、すべてのアプリケーションで と を同じ値validationKey
に設定するだけです。decrytionKey
キーを生成するには、次のコード サンプルに示すように、名前空間のRNGCryptoSErviceProvider
クラスが使用されます。System.Security.Cryptography
public String CreateKey(int numBytes)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[numBytes];
rng.GetBytes(buff);
return BytesToHexString(buff);
}
private String BytesToHexString(byte[] bytes)
{
StringBuilder hexString = new StringBuilder(64);
for (int counter = 0; counter < bytes.Length; counter++)
{
hexString.Append(String.Format("{0:X2}", bytes[counter]));
}
return hexString.ToString();
}