我正在ASP.NET MVC 4中用子项目实现一个应用程序,我希望这些应用程序共享相同的登录名(只需在一个应用中登录,无需登录到子项目中)。
对于webForms,我们通常使用机器键来完成,但在MVC 4中,它已经不起作用了MVC 4中有什么新的解决方案吗
由于Forms authentication
是通过Forms身份验证ticket
完成的,如果所有应用程序共享一个身份验证票证,则用户将只需要登录一次,因此是单次登录。假设我们有两个具有这些URL的应用程序:
http://public.mysite.com/app1/default1.aspx
http://public.mysite.com/app2/default2.aspx
正如您所看到的,它们基本上是同一子域下的两个虚拟目录-public.mysite.com.
由app1编写的cookie将由app2可见,反之亦然。
但是,这并不意味着当用户登录app1时,他会自动登录app2。原因是,默认情况下,每个ASP.NET应用程序都使用自己的加密密钥来创建Forms身份验证票证和cookie。因此,app2无法成功读取app1编写的cookie,即使apps2 我们如何使这两个应用程序相互识别身份验证票证和cookie? 事实上,这在ASP.NET中非常简单。唯一需要做的就是更改web.config文件元素中的设置。以下是machineKey:的默认设置 通过这些设置,.NET框架使用自动生成的 为了生成密钥,使用<machineKey
validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
validation="SHA1"
decryption="Auto"
/>
validationKey
和decrytionKey
来创建身份验证票证和cookie。每个应用程序使用不同的密钥。要使多个应用程序共享相同的身份验证票证和cookie,我们只需要将所有应用程序中的validationKey
和decrytionKey
设置为相同的值。System.Security.Cryptography
命名空间中的RNGCryptoSErviceProvider
类,如以下代码示例所示: 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();
}