有没有办法实现单点登录跨域在MVC5一个简单的方法[复制](Is there a simple wa

2019-10-23 07:42发布

这个问题已经在这里有一个答案:

  • 在跨子ASP.NET身份Cookie的 4个答案

场景:

两个独立的web项目,运行OM这些领域:

  • account.ilovepandas.com
  • ilovepandas.com

使用ASP.Net身份,有没有MVC5一个简单的方法来实现共享登录,因此,如果用户登录到ilovepandas.com和去account.ilovepandas.com,他就已经被验证?

已经做了专题研究,并有一些相当复杂的解决方案在那里,像Thinktecture,OWIN授权服务器。 我的希望是,既然MVC4-5给了我们身份的大检修,也许还有一个更简单的解决方案,现在,我刚才没能找到。

这似乎对我来说是让他们分享的auth-饼干一样简单。

Answer 1:

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]