我将SimpleMembership用于基于ASP.NET MVC4的应用程序。我通过在互联网上关注几个博客来设置认证机制。仅供以下背景是亮点:
•我有一个初始化成员资格的“InitializeSimpleMembershipAttribute”类。确保在首次调用WebSecurity类的任何方法之前调用它。
•我有一个SeedData类,可以成功地利用WebSecurity创建默认用户和角色(DB获取默认数据)。
•处于当前状态的应用程序允许用户登录并使用他有权访问的功能。因此,我认为我们可以说SimpleMembership设置正确且有效。
•现在我正在添加“ResetPassword”功能。我关注过几个博客,例如
http://www.itorian.com/2013/03/PasswordResetting.html#comment-form 和 http://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 =“true”以确保全局配置不会覆盖我的配置。
尝试2: 确保必要的成员资格配置存在于“web.config”中,如以下问题的答案所示: To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider"
尝试3:
在web.config文件中添加了<add key="enableSimpleMembership" value="true" />
。
尝试4: 至少阅读了谷歌上的前10个帮助链接和5个与此主题相关的答案,例如 To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider" 实际上并不明白他是如何通过答案中提到的理由解决错误的。 “ActionExecutingContext”不在“System.Web.Http”中。
你们中的任何一个人都可以提出其他我可以尝试摆脱这个例外的事情吗?
我知道这应该对我有用,并且对时间感到烦恼&gt; 2小时我不得不浪费解决这个问题(使用SimpleMembership并使用我自己的身份验证机制进行废弃处理)。
更新:问题已解决。解决此异常的更改是,我在我的业务层项目中引用了WebMatrix.WebData程序集版本1.0,我将其替换为程序集版本2.0。我有其他项目程序集(DAL)中使用的2.0版程序集。
我比较了两个版本的WebMatrix.WebData程序集但是找不到有问题的代码的任何差异。所以不确定为什么没有将提供者强制转换为“ExtendedMembershipProvider”?
是否与之相关,因为其他项目尤其是Web项目正在加载版本2.0以及使WebSecurity.GeneratePasswordResetToken
查找1.0程序集的业务层,这可能会导致问题?在这种情况下,我不应该从例外中获得警告或其他帮助吗?
提前致谢&gt; SHAILENDRA
答案 0 :(得分:4)
解决此异常的更改是,我在我的业务层项目中引用了WebMatrix.WebData程序集版本1.0,我将其替换为程序集版本2.0。
当我比较两个版本的WebMatrix.WebData程序集时,我找不到任何有问题的代码差异。
然而,我有一个版本2.0程序集的事实已经在另一个项目程序集(DAL)中使用了。
因此,虽然我不是100%确定我的理论,但是在运行时检查提供程序时由于冲突而无法加载正确的程序集(已经加载了一个版本,在DAL项目中引用并且在调用第二个项目方法时它引用了同一程序集的不同版本),它显示了一般的异常消息。
答案 1 :(得分:3)
我必须删除所有项目中的所有WebMatrix.Data和WebMatrix.WebData引用,将它们添加回Copy Local = true,然后一切正常。确保您拥有正确的版本号! v2.something。