2

サブプロジェクトを使用して ASP.NET MVC 4 にアプリケーションを実装していますが、これらのアプリケーションで同じログインを共有する必要があります (1 つのアプリケーションにログインするだけで、サブプロジェクトにログインする必要はありません)。

通常、webForms ではマシン キーを使用して実行しますが、MVC 4 ではそれが機能しなくなりました。MVC 4 でこれに対する新しい解決策はありますか?

4

1 に答える 1

0

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 フレームワークは自動生成された を使用して、認証チケットvalidationKeydecrytionKeyCookie を作成します。各アプリケーションは異なるキーを使用します。複数のアプリケーションで同じ認証チケットと 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();
 }
于 2014-04-05T09:44:34.570 に答える