2013-08-05 31 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

相关问题