场景:
两个独立的web项目,运行OM这些领域:
- account.ilovepandas.com
- ilovepandas.com
使用ASP.Net身份,有没有MVC5一个简单的方法来实现共享登录,因此,如果用户登录到ilovepandas.com和去account.ilovepandas.com,他就已经被验证?
我已经做了专题研究,并有一些相当复杂的解决方案在那里,像Thinktecture,OWIN授权服务器。 我的希望是,既然MVC4-5给了我们身份的大检修,也许还有一个更简单的解决方案,现在,我刚才没能找到。
这似乎对我来说是让他们分享的auth-饼干一样简单。
TL; DR:假设这两个应用共享相同的顶级域名,您可以共享验证cookie。 坐落在cookie中的域,并共享必要的任何键在应用程序之间进行解密。
在这里,我要你使用FormsAuthentication承担。
1)添加domain
属性的authentication/forms
部分:
<authentication mode="Forms">
<forms loginUrl="~/account/login"
timeout="2880"
defaultUrl="~/"
slidingExpiration="true"
protection="All"
domain=".yourdomain.tld"
name="YOUR_COOKIE_NAME" />
注意在域主导时期。
2)为了使这两个应用将能够解密的cookie,你需要一个machineKey中同时添加到,并使用相同的验证和加密密钥:
<machinekey compatibilitymode="Framework45"
validation="HMACSHA256"
validationkey="YOURVALIDATIONKEYHERE"
decryption="AES"
decryptionkey="YOURDECRYPTIONKEYHERE" />
您可以使用IIS管理器中的机器主要工具(假设您可以访问到Web服务器),或任何其他工具可以让你有效的密钥。 如果你需要一个建议,我建立了一个应用程序,你可以用在这里 ,可链接到它的Github的项目,如果你想生成自己的钥匙。
为了完整:
这里是一个将产生有效的密钥类:
public class KeyGenerator
{
public string GenerateKey(int length, bool useUpperCase = true)
{
byte[] buffer = new byte[length];
var randomNumberGenerator = new RNGCryptoServiceProvider();
randomNumberGenerator.GetBytes(buffer);
return ToHexString(buffer, true);
}
private static string ToHexString(byte[] bytes, bool useUpperCase = false)
{
var hex = string.Concat(bytes.Select(b => b.ToString(useUpperCase ? "X2" : "x2")));
return hex;
}
}
你会使用这样的事情让你的钥匙:
var generator = new KeyGenerator();
/* 512 bits = 64 bytes (512 / 8) */
string validationKey = generator.GenerateKey(64);
/* 256 bits = 32 bytes (256 / 8) */
string decryptionKey = generator.GenerateKey(32);
文章来源: Is there a simple way to implement Single Sign On across domains in MVC5 [duplicate]