2013-06-03 229 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

相關問題