如何在子项目之间共享登录



我正在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:的默认设置

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

通过这些设置,.NET框架使用自动生成的validationKeydecrytionKey来创建身份验证票证和cookie。每个应用程序使用不同的密钥。要使多个应用程序共享相同的身份验证票证和cookie,我们只需要将所有应用程序中的validationKeydecrytionKey设置为相同的值。

为了生成密钥,使用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();
 }

最新更新