2013-08-05 65 views
4

我正在爲基於ASP.NET MVC4的應用程序使用SimpleMembership。我通過在互聯網上關注幾個博客來設置身份驗證機制。只是以下背景是亮點:錯誤「Membership.Provider」屬性必須是「ExtendedMembershipProvider」的實例

•我有一個類InitializeSimpleMembershipAttribute初始化成員資格。確保在首次調用WebSecurity類的任何方法之前調用它。

•我有一個SeedData類,它可以成功地使用WebSecurity創建默認用戶和角色(數據庫獲取默認數據)。

•處於當前狀態的應用程序允許用戶登錄並使用他有權訪問的功能。因此我認爲我們可以說SimpleMembership安裝正確並且正常工作。

•現在我添加「ResetPassword」功能。我已經關注了幾個博客,例如

http://www.itorian.com/2013/03/PasswordResetting.html#comment-formhttp://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity.resetpassword(v=vs.111).aspx

我已經實現基本的東西(圖和邏輯),但是當我做出 WebSecurity.GeneratePasswordResetToken(用戶名)的呼叫;

我得到以下異常。

要調用此方法,「Membership.Provider」屬性必須是「ExtendedMembershipProvider」的實例。 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。 異常詳細信息:System.InvalidOperationException:要調用此方法,「Membership.Provider」屬性必須是「ExtendedMembershipProvider」的實例。

我在ILSpy看到這是來自WebSecurity.VerifyProvider()方法。但我不明白爲什麼?

ExtendedMembershipProvider extendedMembershipProvider = Membership.Provider as ExtendedMembershipProvider; 

以上內容來自WebSecurity班線必須返回null造成但是這個例外它不應該是作爲配置在web.config文件存在,我無處使用未從「ExtendedMembershipProvider擴展任何其他供應商」。

讓我向您展示我的web.config,它是根據人們爲解決此問題而提出的建議進行了一些修改。

<appSettings> 
    <add key="webpages:Version" value="2.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="PreserveLoginUrl" value="true" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    <add key="enableSimpleMembership" value="true" /> 
    </appSettings> 
    <system.web> 
    <httpRuntime targetFramework="4.5" /> 
    <compilation debug="true" targetFramework="4.5" /> 
    <pages> 
     <namespaces> 
     <add namespace="System.Web.Helpers" /> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Optimization" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.WebPages" /> 
     </namespaces> 
    </pages> 
    <roleManager enabled="true" defaultProvider="SimpleRoleProvider" lockItem="true"> 
     <providers> 
     <clear /> 
     <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" /> 
     </providers> 
    </roleManager> 
    <membership defaultProvider="SimpleMembershipProvider" lockItem="true"> 
     <providers> 
     <clear /> 
     <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" /> 
     </providers> 
    </membership> 
    <sessionState mode="InProc" customProvider="DefaultSessionProvider"> 
     <providers> 
     <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PublicWebsiteDbContext" /> 
     </providers> 
    </sessionState> 
    <profile defaultProvider="DefaultProfileProvider"> 
     <providers> 
     <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="PublicWebsiteDbContext" applicationName="/" /> 
     </providers> 
    </profile> 
    </system.web> 

嘗試1: 設置lockItem上的屬性=「真」之上,以確保全球配置不重寫我的配置。

嘗試2: 有保證的必要配置的成員中存在的「web.config」作爲回答下面的問題建議: To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider"

嘗試3: 新增<add key="enableSimpleMembership" value="true" />在web.config文件。

嘗試4: 已閱讀至少谷歌10大幫助鏈接和5個與此主題相關的SO上的答案,例如 To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider" 其實不明白他是如何解決答案中提到的原因的錯誤。 「ActionExecutingContext」不在「System.Web.Http」中。

你們中的任何一個人可以建議其他的事情,我可以嘗試擺脫這種異常請嗎?

我知道這應該爲我工作,以及只要時間> 2小時,我不得不浪費解決這個問題(在使用SimpleMembership使用我自己的身份驗證機制廢料點)惱火。

更新:問題解決了。解決此異常的更改是,我在我的業務層項目中引用WebMatrix.WebData程序集版本1.0,我用程序集版本2.0替換它。我有其他項目程序集(DAL)中使用的2.0版程序集。

我比較了兩個版本的WebMatrix.WebData程序集,但是在代碼中找不到任何區別。因此,不確定爲什麼它無法將提供程序強制轉換爲「ExtendedMembershipProvider」?

它可能是相關的,因爲其他項目特別是web項目加載2.0版本和業務層正在使WebSecurity.GeneratePasswordResetToken尋找1.0程序集,它可能會導致問題?在這種情況下,我是否應該得到警告或其他異常幫助?

在此先感謝>賽倫德拉

+0

問題解決了。解決此異常的更改是,我在我的業務層項目中引用WebMatrix.WebData程序集版本1.0,我用程序集版本2.0替換它。我有其他項目程序集(DAL)中使用的2.0版程序集。我想弄明白爲什麼會有所作爲,會在發現時發佈。 – SBirthare

回答

4

解決此異常的更改是,我在業務層項目中引用WebMatrix.WebData程序集版本1.0,我用程序集版本2.0替換它。

當我比較WebMatrix.WebData程序集的兩個版本時,我無法找到有問題的代碼中的任何差異。

但是,事實上,我已經在另一個項目程序集(DAL)中使用了2.0版程序集。

所以,雖然我不是100%確定我的理論是,在運行時檢查提供程序時,由於衝突而無法加載正確的程序集(一個版本已加載,在DAL項目中引用並且第二個項目方法爲稱它引用了不同版本的相同程序集),它顯示了一般的異常消息。

+0

謝謝!!!!! = D – Karine

+0

我有同樣的問題,但我已經使用WebMatrix.WebData版本2.任何想法? –

+1

@DanCsharpster - 那麼有很多事情要檢查或嘗試。如果你已經嘗試了我在上面的帖子中提到的內容,我建議發佈一個新的問題,詳細說明你的實現和確切的錯誤。 – SBirthare

3

,我不得不刪除我的所有項目的所有WebMatrix.Data和WebMatrix.WebData引用,加回與複製本地= true,那麼它的所有工作。確保你有正確的版本號! v2.something。

+1

我愛你搶劫;) – Zeeshan

相關問題