2009-12-08 56 views
2

我有一個自定義的成員資格和角色提供程序,我在應用程序中設置。在ASP .Net Webforms我使用相同的提供程序,並且在應用程序編譯並運行時,由於web.config中的引用而初始化提供程序。自定義RoleProvider與MVC 2.0

當我把它移動到MVC並在我的這些類的「初始化」方法中放置斷點時,中斷不會被打中。

奇怪的是:如果我在控制器中使用「[Authorize(Roles =」MYROLE「)]」進程,然後點擊該Action,然後發送到Roleprovider並自動調用「GetRolesForUser」,但仍然不會點擊初始化。這是一個問題,因爲我需要在調用任何方法之前設置一些變量。

我知道我可以直接調用「Initialize」,但會認爲這會自動完成,因爲它是在ASP Webforms中。

我必須在MVC中手動初始化這些嗎?還是我錯過了一些東西?

+0

你應該調用初始化在構造你的角色提供:

此外,獲得特定成員提供的另一種方法similiar也可以在找到。 – 2009-12-08 17:32:30

+0

@Nissan Fan:爲什麼在AP WebForms中它會自動調用Initialize方法,這是因爲在web.config中設置了成員資格? – Jay 2009-12-08 18:36:48

回答

-1

Jay,我想他們的工作方式與角色/成員資格提供者在ASP.NET WebForms中的工作方式相同。

一件事,你應該嘗試是創建自定義的授權過濾器,將調用您的應用程序的方法,如:

public class MyAuthorizeAttribute: FilterAttribute, IAuthorizationFilter 
{  
    public string Role { get; set; } 

    #region IAuthorizationFilter Members  
     public void OnAuthorization(AuthorizationContext filterContext)  
     {   
      // add your logic here like 
      // var userRoles = MyCustomProvider.GetRolesForUser(filterContext.HttpContext.User.Identity); 
      // if(!userRoles.Contains(Role)) 
      // ..... 
     }  
    #endregion 
} 

,然後在你的動作中使用[MyAuthorize(Role = "MYROLE")]

0

需要考慮的事情首先,成員資格和角色提供者是靜態的,並且通常只在第一次在應用程序中訪問時初始化。在Web.Config中正確設置時,它們將在第一次訪問時調用初始化。

通過使用基本的提供者集合和默認ASP.NET MVC 2應用程序進行一些測試,我發現RoleProvider通常在應用程序啓動時立即初始化。有一點需要注意,如果你想讓提供者重新初始化,你必須停止你的開發Web服務器(或iis express,或者清除應用程序池)。這樣應用程序重新啓動。如果你不這樣做,並且提供者已經被初始化,它將永遠不會因爲它已經被運行而擊中這些中斷點。另外,在獲取成員資格提供者的實例時,不要通過創建類的新實例(即var provider = new MyMembershipProvider())來實現,因爲這不會調用initialize方法。一定要通過Membership.Provider獲取您的提供者,它將處理您正確配置的web.config提供程序的所有設置。

在AccountModels文件(〜第101行)中的默認MVC 2應用程序提供了一個很好的例子。

_provider = provider ?? Membership.Provider; 

第一次它的訪問,就會實例化默認會員供應商和呼叫初始化。之後,它對應用程序保持靜態,並且在應用程序從內存中卸載之前不會被再次調用。即。停止vs web開發服務器。How do I call Initialize on a custom MembershipProvider?

希望這有助於:)

相關問題