2012-10-29 68 views
23

除了已在AccountController.cs文件中生成的內容之外,我無法使WebSecurity對象在任何地方工作。帳戶控制器在頂部設置了[InitializeSimpleMembership]屬性。例如,登錄功能不會抱怨呼叫WebSecurity.Login(...)。我添加了一個子動作的AccountController:在調用「WebSecurity」類的任何其他方法之前,必須先調用「WebSecurity.InitializeDatabaseConnection」方法。

[ChildActionOnly] 
     [AllowAnonymous] 
     public ActionResult NavBar() 
     { 
      NavBarViewModel viewModel = new NavBarViewModel(); 
      viewModel.LinkItems = new List<NavBarLinkItem>(); 

      if (Request.IsAuthenticated) 
      { 
       SimpleRoleProvider roleProvider = new SimpleRoleProvider(); 
       if (roleProvider.IsUserInRole(User.Identity.Name, "User")) 
       { 
        viewModel.LinkItems.Add(new NavBarLinkItem() 
        { Title = "Create Project", Action = "Create", Controller = "Project" }); 

       } 

      } 

      viewModel.LinkItems.Add(new NavBarLinkItem() { Title="Help", Action="Index", Controller="Help" }); 

      return PartialView("_NavBar", viewModel); 
     } 

保持原樣,對「如果(roleProvider.IsUserInRole(User.Identity.Name,‘用戶’))」與主題錯誤消息線路的代碼崩潰。所以,我進入InitialzeSimpleMembershipAttribute.cs文件和複製/粘貼此行我的函數的頂部:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 

...和獲取WebSecurity.InitializeDatabaseConnection應該只被調用一次錯誤消息。這是有道理的,因爲在控制器定義的頂部有一個屬性應該已經調用了這個函數(它看起來確實很好)。所以爲了安全起見,我改變上述呼籲:

if (!WebSecurity.Initialized) 
      { 
       WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", 
                 "UserName", autoCreateTables: true); 
      } 

...,回到原來的錯誤信息,即WebSecurity.InitializeDatabaseConnection應該等等等等之前被調用。任何洞察到這個瘋狂將不勝感激

回答

5

我發現這在interwebs上:http://forums.asp.net/t/1718361.aspx/1 基本上,不要使用SimpleRoleProvider類型。有一個角色對象中可用,允許簡單的調用是這樣的:

if (Request.IsAuthenticated) 
{ 
    if(Roles.IsUserInRole(User.Identity.Name, "User")) 
    { 
    viewModel.LinkItems.Add(new NavBarLinkItem() 
    { Title = "Create Project", Action = "Create", Controller = "Campaign" }); 
    } 
} 
+1

這實際上並不像它需要的那樣清晰。我查看了鏈接,但與我在做什麼(我認爲?)無關,因爲我不想創建角色。 我有同樣的問題,我得到一個「不能調用這個兩次」的消息,但是當我把「第二個」一個,我得到「你必須調用...」的消息。什麼是「你必須調用...」的消息崩潰是: if(OAuthWebSecurity.Login(result.Provider,result.ProviderUserId,createPersistentCookie:false)) 任何想法? –

9

添加[InitializeSimpleMembership(文提到的和掉AccountController找到)控制器的頂部,我需要從做的伎倆訪問WebSecurity我。不知道但是如果預期實現方法雖然...

[InitializeSimpleMembership] 
public class DataController : Controller 
{ ... } 
48

有一個更好的解釋在這裏: http://odetocode.com/blogs/scott/archive/2012/09/24/perils-of-the-mvc4-accountcontroller.aspx

這裏有所有你需要做的:

  1. 從頂部移除[InitializeSimpleMembership]AccountController
  2. 將/Filters/InitializeSimpleMembershipAttribute.cs(第39行)中的WebSecurity.InitializeDatabaseConnection(...)調用複製到/ AppStart/A uthConfig.cs
  3. 可以隨時從您的項目中刪除InitializeSimpleMembershipAttribute.cs

你不InitializeDatabaseConnection()調用添加到AuthConfig.RegisterAuth()但似乎邏輯的地方,讓您清潔的Global.asax 。

你實質上正在做的是從原始屬性中提取初始化調用,並在Application_Start上顯式調用它。如果您不使用(或不需要)SimpleMembership,則屬性中的其他所有內容都是條件檢查。

+0

我能夠將'[InitializeSimpleMembership]'屬性放在控制器的頂部,現在就可以工作。 – jwatts1980

+0

很好的解釋兄弟。 –

+0

這樣做的後果是什麼?我想這是有道理的。 – Coops

1

首先,您必須在網絡中設置您的角色和成員資格提供者。配置:

<authentication mode="Forms"> 
    <forms loginUrl="/Account/Login" slidingExpiration="true" timeout="60" /> 
</authentication> 
<membership defaultProvider="p1"> 
    <providers> 
    <add name="p1" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/> 
    </providers> 
</membership> 
<roleManager enabled="true" defaultProvider="p1"> 
    <providers> 
    <add name="p1" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> 
    </providers> 
</roleManager> 

當您創建SimpleRoleProvider的新實例,使用非空構造函數,並提供默認RoleProvider在web.config中設置參數:

SimpleRoleProvider srp = new SimpleRoleProvider(Roles.Provider); 

的解決方案是

SimpleMembershipProvider msp = new SimpleMembershipProvider(Membership.Provider); 
1

在我而言,我不得不禁用匿名身份驗證即:在SimpleMembershipProvider的情況相同取決於IIS身份驗證設置。

然後我不得不啓用窗體和Windows身份驗證。 這當然取決於您的應用程序需要的任何身份驗證。

一旦我這樣做了,錯誤消失了,應用程序按預期工作。

相關問題