使用 simplemembership 的新 MVC 4 Internet 模板中基於角色的身份驗證
我喜歡 MVC 4 網際網路模板中新的 simplemembership 功能,其中包含指向 VS 2012 RTM 中外部登錄的 OAuth 的連結。大多數情況下,身份驗證功能都在工作。但是,即使在此花費了 8 多個小時後,我也無法實施基於角色的授權來在我的控制器上工作。事實證明,SimpleMembership 絕非簡單。
我搜尋了 stackoverflow,Google搜尋並閱讀了John Galloway的最新文章,嘗試了許多建議,但仍然無法解決這個問題。這一切都始於出現 Sql 連接錯誤,並且無法弄清楚為什麼連接字元串和其他一切都很好。花了好幾個小時才弄清楚是 Roles 類導致了問題。
控制器上的 [Authorize] 屬性與以前一樣用於基本身份驗證。但是每當我嘗試使用角色時,它都會出現 sql 連接錯誤(因為它會恢復為舊的 DefaultRolesProvider,它試圖連接到預設的 SqlExpress aspnetdb 文件並失敗)。所以像:
[Authorize(Roles="admin")]不起作用。如果我回到舊的 asp.net 會員提供程序,它會起作用,但是我會失去簡單的數據庫表、基於令牌的確認和恢復、更安全的密碼散列以及更重要的是通過 OAuth 進行的外部登錄。
在程式碼和剃刀視圖中唯一有效的是
User.IsInRole("admin")這對於菜單項等來說是可以的,但是在控制器中的每個動作中實現非常麻煩(而且我不喜歡它一次只測試一個角色)。
我將非常感謝任何解決此問題的指導。
在這裡找到了 Mehdi Golchin的答案,似乎可以解決:
[Authorize(Roles="admin,editor,publisher")]如果我也將它添加到家庭控制器:
[InitializeSimpleMembership]因為此屬性位於 Accounts 控制器上,所以 SimpleMembership 數據庫僅在第一次使用帳戶控制器(如登錄/註冊)後才會初始化。即使目前使用者從 cookie 登錄,數據庫也不會初始化,因此會引發錯誤。一種解決方案是將此屬性放在我啟動網站時呼叫的主控制器上。但是,它需要放置在每個控制器上,因為我檢查角色並根據角色顯示不同的菜單項。
這是一個糟糕的設計,因為數據庫應該在 App_Start 上初始化,而不是在第一次使用時初始化。
我確實嘗試過
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);在 中
Global.asaxApplication_Start(),它使用 來處理菜單項中的角色檢查User.IsInRole("admin"),但隨後在任何具有屬性的控制器中拋出錯誤[Authorize(Roles="admin")],即使應用了附加屬性[InitializeSimpleMembership]也是如此。因此,現在的解決方案是將 `[InitializeSimpleMembership] 放在所有控制器上,因為使用者最初可能會使用外部連結登陸任何頁面。
它仍然不知道如何初始化 SimpleRolesProvider 類來做更多的角色管理,而不僅僅是
User.IsInRole().這些東西在 webmatrix 網頁站點中效果更好,顯然 MVC 埠並不完整。它與預設的 asp.net 會員提供程序發生衝突並混淆。
編輯 好的我不認為
[InitializeSimpleMembership]可以通過將此行放在FilterConfig.csApp_Start 文件夾中來全域應用過濾器:filters.Add(new InitializeSimpleMembershipAttribute());這可以解決這個問題。現在需要一個 SimpleRolesProvider 初始化的解決方案,否則我將不得不編寫自己的角色提供程序。
更新:
Scott Allen 的這篇文章解決了我所有的問題。
通過將其包含在 web.config 中:
<roleManager enabled="true" defaultProvider="simple"> <providers> <clear/> <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> </providers> </roleManager> <membership defaultProvider="simple"> <providers> <clear/> <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/> </providers> </membership>Roles 和 Membership 類的所有方法都可用,並且可以在程式碼中初始化,如下所示:
var roles = (SimpleRoleProvider) Roles.Provider; var membership = (SimpleMembershipProvider) Membership.Provider;