Поскольку 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();
}
Проверьте это [ответ] (http://stackoverflow.com/a/13340692/674700). –