2

我有以下結構ASP.NET 4.0單點登錄失敗

www.website.com - > ASP.NET 4.0的Web站點

WWW NET 4.0,Web應用程序

兩者都對相同的SQL數據庫執行表單身份驗證,並使用框架ASP.NET成員資格和角色。我可以登錄到每個部分就好(相同的用戶/密碼),但身份驗證不會結束,即如果我登錄到/,然後單擊指向/blog/的鏈接,/blog/認爲我是匿名並提示再次登錄。我已經做了基本

  1. 在這兩個網站以及應用程序相同的<authentication mode="Forms"> web.configs
  2. 相同<machineKey>部分(是的,相同的validationKey和decryptionKey)

於是我檢查了生成的cookie,並注意到網站和網絡應用似乎在處理不同的cookie。通過website.com/blog

  • .ASPXFORMSAUTH-27604f05-86ad-47ef-9e05-950bb762570c
  • .ASPXROLES創建

餅乾創建由website.com

餅乾

  • .ASPXFORMSAUTH

,我認爲這是問題,但我看到它,儘管有相同<authentication>部分,它看起來像

<authentication mode="Forms"> 
    <forms timeout="30" slidingExpiration="true" name=".ASPXFORMSAUTH" enableCrossAppRedirects="true" protection="All" cookieless="UseCookies"/> 
</authentication> 

我看過其他幾個職位像 Single Sign On with Forms Authentication 以及 http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

有還有一些我現在無法回憶的帖子。我已經經歷過他們(全部?),但我仍然陷入困境。如果需要,我可以很樂意提供更多的調試數據。

會真的很感謝任何人可能有的提示!我認爲我在這一個上打了一堵牆!

回答

2

好的,所以我能夠在更長的時間周圍回答我自己的問題。

基本上,BlogEngine.NET 2.5(我的網絡應用程序)似乎是重寫.NET 4.0框架的做事方式。有幾件事情需要修復,全部在BlogEngine.Core \ Security \ Security.cs(下載BlogEngine。NET源代碼)

第1部分:修正cookie的名稱

在有我改變如下的方法FormsAuthCookieName:

File: BlogEngine.Core\Security\Security.cs 
Method: FormsAuthCookieName() 
// return FormsAuthentication.FormsCookieName + "-" + Blog.CurrentInstance.Id.ToString(); 
return FormsAuthentication.FormsCookieName; 

這確保了該cookie 名稱是相同的。一個障礙了下來...

第2部分:避免web應用程序/ BlogEngine.NET的登錄頁面/控制/代碼

而是引導用戶的登錄到BlogEngine.Net的login.aspx的(www.website .com \ blog \ account \ login.aspx),我指向全部登錄鏈接到我的主網站的login.aspx頁面(www.website.com \ login.aspx)。如果你想知道如何實現你自己的網站範圍的身份驗證,這是一個超快速指南

msdn.microsoft.com/en-us/library/ff184050.aspx. 

我也有這樣的事情添加到這兩個網站的web.config以及Web應用程序web.config,所以任何時候訪問受保護的資源(從網站或Web應用程序)我自己的全局/登錄/ Aspx被使用。

<authentication mode="Forms"> 
<forms timeout="30" loginUrl="/login.aspx" blah blah /> 
</authentication> 

現在,我自己一般,整個網站的用戶登錄控件將被創建(.NET框架標準)認證cookie和(用戶)角色餅乾。通過避免使用BlogEngine.NET的login.aspx,我們更清潔,並且避免調用這個有問題的代碼。

File: BlogEngine.Core\Security\Security.cs 
Method: AuthenticateUser(string username, string password, bool rememberMe) 

詳情:該代碼添加了一個「博客實例」到Cookie,所以所以如果你有在同一個域中的多個博客,這樣可以防止用戶1認證的博客實例1從不會自動認證上博客實例2.我猜大多數每個域只有一個博客(www.domain.com \ blog!),所以這是不必要的。更重要的是,該檢查會打破我們的單一登錄。

兩個關下來...

第3部分:固定每個訪問權限檢查

現在,我們的網站廣泛,標準化login.aspx的不加具體BlogEngine.NET實例ID(見上文)。這可能是好的,除了還有一些BlogEngine.NET代碼專門用於查找這些代碼。我們不需要那張支票要麼,所以讓我們刪除違規支票......

File: BlogEngine.Core\Security\Security.cs 
Method: void Init(HttpApplication context) 
// Comment line below to revert to only-framework/default processing 
//context.AuthenticateRequest += ContextAuthenticateRequest; 

所以在這一點上,你應該有

  • 由單一,網站廣泛login.aspx的處理的所有登錄
  • 所有身份驗證Cookie 用戶角色的Cookie,上述網站廣泛login.aspx的
  • 加密,每兩個網站& web應用web.configs的保護,所有這些創建的cookie(其應該匹配!)

這反過來允許單點登錄:)!萬歲!

+0

我建議看看如果你不能讓你的修改變得可配置並讓維護人員接受它。在我看來,它主要是在同一個域上的多個引擎之間進行權衡,並且單點登錄 - 您可能必須選擇其中一個或另一個,但用戶不應該爲了使其正常工作而進行調試...... – jmoreno

1

另外:在兩個web.configs中,您都必須使用相同的validationKey和相同的decryptionKey插入machinekey。

0

很好研究。我下載了源代碼並創建了mods。不幸的是,我無法讓它工作。我研究了源代碼,你的建議似乎完全合理。我對自己的處境感到不知所措。無論如何,感謝分享。

+0

謝謝。檢查jmoreno的答案也是。 machine.config/web.config中的不同覆蓋鍵可能會導致錯誤。希望能幫助你。 – DeepSpace101

+0

原因是.net 4.0和.net 4.5之間存在加密更改。 –

+1

我在blogengine源代碼中配置了單點登錄,並且拉請求被接受到主分支中。所以在web.config中,您設置BlogEngine.SingleSignOn = true以獲得所需的行爲。 –