2013-07-16 3 views
2

Я реализую приложение в ASP.NET MVC 4 с подпроектами, и я хочу, чтобы эти приложения использовали один и тот же логин (просто войдите в одно приложение и не нужно входить в подпроекты).Как я могу делиться логином между подпроектами?

С помощью webForms мы обычно используем машинный ключ для этого, но в MVC 4 он больше не работает. Есть новое решение для этого в MVC 4?

+0

Проверьте это [ответ] (http://stackoverflow.com/a/13340692/674700). –

ответ

0

Поскольку Forms authentication осуществляется с помощью проверки подлинности форм ticket, если все приложения используют один билет аутентификации, пользователь должен будет только войти в один раз, таким образом, единый вход в систему. Скажем, у нас есть два приложения с этими адресами:

http://public.mysite.com/app1/default1.aspx 
http://public.mysite.com/app2/default2.aspx 

Как вы можете видеть, что они в основном две виртуальных каталогов под одной поддомена - public.mysite.com. печенье, написанное app1 будет видны на app2, и наоборот.

Однако это вовсе не означает, что, когда пользователь входит в App1, он автоматически регистрируется в app2. Причина в том, что каждое приложение ASP.NET по умолчанию использует свои собственные ключи шифрования для создания билета аутентификации Forms и файла cookie. Таким образом, cookie, написанный app1, не может быть успешно прочитан app2, хотя видно, что app2.

Как мы можем сделать два приложения распознающими друг друга аутентификационный билет и cookie?

На самом деле, это довольно просто в ASP.NET. Единственное, что нужно сделать, это изменить настройки в элементе файла web.config. Вот настройки по умолчанию для machinKey:

<machineKey 
validationKey="AutoGenerate,IsolateApps" 
decryptionKey="AutoGenerate,IsolateApps" 
validation="SHA1" 
decryption="Auto" 
/> 

С помощью этих настроек, рамки .NET использует автоматически validationKey и decrytionKey создать билет аутентификации и печенье. Каждое приложение использует разные ключи. Чтобы несколько приложений могли использовать один и тот же билет аутентификации и файл 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(); 
} 
Смежные вопросы