2013-07-14 188 views
0

我正在構建幾個將共享數據庫的ASP.NET MVC網站(因爲它們共享數據庫中的數據)。也就是說,網站之間的登錄目前不會共享。作爲參考,我正在使用NHibernate進行數據訪問,使用SQL Server(目前)。需要ASP.NET身份驗證建議

按照當前規定,系統具有網站,角色,用戶和權利的表格。網站有一組用戶,權利和角色。用戶可以扮演很多角色。角色擁有一組權利。用戶將能夠使用用戶名和密碼登錄,但我不想讓自己陷入一個角落 - 我可能希望他們能夠稍後使用Google或Facebook登錄。

現在,我有點困惑,以確保網站的安全。我不喜歡老派的會員和角色提供者,原因有幾個。其中最主要的是我不會通過角色限制很多東西;基於用戶訪問權限,事物將受到限制。我正在查看以下幾種身份驗證方案。 1)我想能夠通過屬性指定使用控制器方法所需的權限。 2)我希望能夠快速查詢並查看用戶是否處於特定角色或具有特定權利。

所以,我實際上有一組問題,但它們有點相互纏繞。首先,我該怎麼做?只是一個自定義授權屬性?其次,什麼是登錄等工作流程?需要哪些步驟才能正確安全地工作?

我意識到這些都是不好意思的問題,但過去我已經習慣了舊的提供者的做事方式。我並不特別在意這一點,並且真的想要一些更好的建議。所以我想我的一切都是新的。

+0

成員資格和角色是因爲他們利用大量的東西,我們需要偉大的,你總是可以創建一個[自定義成員和角色](http://stackoverflow.com/questions/5701673/custom-membershipprovider-in-net-4-0/5702000#5702000),你知道一個用戶可以有n個角色是正確的嗎?所以,如果你通過'controller'創建角色,那麼你將更容易完成你所需要的。 – balexandre

回答

0

我會像有害生物一樣逃離MS的會員提供商。當它與.NET 2.0一起推出時,它已經被嚴重的實施了,最近的刷新並沒有好轉。

角色,用戶,..沒有綁定到會員提供商,你可以自己使用這些。建立身份認證,創建一個處理一個httmodule說,身份認證(用於Context.User.Identity一個簡單的用戶id就足夠了)

所有你需要的是從IIdentity的,在你httmodule

string[] roles = new[] {"Admin", "CoolDude"}; 
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(user, roles); 

派生的用戶。 。現在在你的mvc控制器中只需添加必要的認證屬性,玩過遊戲!

製作自定義角色,自定義MVC屬性或查詢,如果用戶是直接一個特定的角色

if (HttpContext.Current.User.IsInRole("Admin")) { ... 
+0

關於成員資格提供者沒有什麼「嚴重實施」,儘管做了一些不理想的決定(例如全局靜態實例),但是這些決定是最糟糕的。 99%試圖實施自己的用戶名/密碼管理的人會不安全地做到這一點,我認爲使用默認提供者比自己做得更好,除非你知道你在做什麼。 –

+0

無論如何,我必須使用不同的存儲機制。我並不是真的希望事物繞過我的業務層來創建和驗證用戶,我希望NHibernate提供的所有緩存等的優點。我想我可以實現一個自定義提供程序。我只是不知道這是否還是最好的主意。 –

+0

@WillGant - 我不一定會實現自定義提供程序,事實上在大多數情況下,我認爲自定義提供程序是錯誤的答案,因爲.net成員資格被設計爲可重用的通用系統。問題是,大多數人真的不明白,Membership只是一個存儲和驗證證書的系統。而已。與之相關的是Roles和Profile系統,以及FormsAuthentication系統。這些都是不同的東西。在心裏。 .net使用IIdentity和IPrincipal類,其中實現您自己的版本可能是有益的 –