2013-06-03 246 views
1

我们有两个单独的MVC 4 Web应用程序,它们作为同一网站的一部分运行。主(父)项目具有身份验证,并且工作正常。现在我们已经将第二个项目添加到同一个站点(一个运行在子框架中的页面),我们无法弄清楚如何使用户通过父应用程序进行授权。在父应用程序和子应用程序之间共享身份验证

两者都使用相同的形式元素在web.config中:

<forms loginUrl="~/Account/LogOn" name=".ASPXFORMSAUTH" domain="..." protection="All" timeout="2880"/> 

我需要比孩子项目的[授权 - 标签吗?

[Authorize] 
public class HomeController : Controller 
{ 
    ... 

    public ActionResult Index() 
    { 

     return View(); 
    } 

    ... 
} 

大概是不用说了,如果我尝试访问该子项目的HomeController中,即使用户在父项目登录页面被重定向到登录页面。

这两个项目都使用相同的machineKey。

任何想法?

回答

1

确保域属性设置为父域:

<forms 
    loginUrl="~/Account/LogOn" 
    name=".ASPXFORMSAUTH" 
    domain="domain.com" 
    protection="All" 
    timeout="2880" 
/> 

还要确保您已设置在同一台机器密钥两种应用:

<machineKey validationKey="5C1E392DB9867A990FE0161B8BD07C1B165921DDAB21ADCC4C8F15D67EA2DECD7AEBB04409A411C69CB125EDEA3702B64DF17D47AD951461F444175BDF0277CF" decryptionKey="43CC900E97D496FC6C5C0C12FE005F9E846675C4BD45977BA5CEE852741ED3B6" validation="SHA1" decryption="AES" /> 

这将确保由第一个应用程序加密的表单身份验证Cookie可以由第二个解密。您可以使用following website来生成强大的机器密钥。

+0

它们使用相同的域字符串,并且它们也具有相同的machineKey元素。然而,域名字符串与“domain.com”类似,而网站访问的网址类似于“sub1.sub2.domain.com”。只要字符串在父类和子类web.configs中匹配,这是否会有所作为? – SamiHuutoniemi

+0

不,如果您的网站托管在“sub1.domain.com”和“sub2.domain.com”上,您应该将域属性设置为“domain =”domain.com“'。如果您不使用任何ASP.NET会话,这应该工作。这只是共享表单身份验证Cookie,而不是会话。如果你依赖某个会话,它将无法工作,因为会话默认存储在应用程序的内存中。如果您希望能够在应用程序之间共享会话,则必须使用共享会话提供程序(例如SQL Server)。 –

+0

是的。我们只是分享表单身份验证Cookie。所以这应该工作。但是,它没有。我可以看到,Cookie是在Chrome中创建的,但不知道为什么子项目无法解密它。 – SamiHuutoniemi

相关问题