我将 SimpleMembership 用于基于 ASP.NET MVC4 的应用程序。我通过在互联网上关注一些博客来设置身份验证机制。仅作为背景,以下是亮点:
• 我有一个初始化成员资格的类“InitializeSimpleMembershipAttribute”。确保在第一次调用 WebSecurity 类的任何方法之前调用它。
• 我有一个SeedData 类,它成功地利用WebSecurity 创建了默认用户和角色(DB 获取默认数据)。
• 当前状态下的应用程序允许用户登录并使用他有权访问的功能。因此,我认为我们可以说 SimpleMembership 设置正确并且工作正常。
• 现在我正在添加“重置密码”功能。我关注了一些博客,例如
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(userName);
我得到以下异常。
要调用此方法,“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”中存在必要的成员资格配置,如以下问题的答案所示: 要调用此方法,“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例
尝试 3:<add key="enableSimpleMembership" value="true" />
在 web.config 文件中添加。
尝试 4:至少已阅读 google 上的前 10 个帮助链接和与此主题相关的 SO 上的 5 个答案,例如 要调用此方法,“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例 实际上不明白如何他用答案中提到的原因解决了错误。“ActionExecutingContext”不在“System.Web.Http”中。
你们中的任何人都可以建议我可以尝试摆脱这个例外的其他事情吗?
我知道这也应该对我有用,只是对我不得不浪费解决此类问题的时间超过 2 小时感到恼火(此时使用 SimpleMembership 并使用我自己的身份验证机制)。
更新:问题已解决。解决此异常的更改是,我在业务层项目中引用了 WebMatrix.WebData 程序集版本 1.0,我将其替换为程序集版本 2.0。我也有其他项目程序集(DAL)中使用的 2.0 版程序集。
我比较了 WebMatrix.WebData 程序集的两个版本,但是没有发现有问题的代码有任何区别。所以不确定为什么无法将提供者转换为“ExtendedMembershipProvider”?
WebSecurity.GeneratePasswordResetToken
是否与其他项目特别是 Web 项目正在加载版本 2.0 和正在寻找 1.0 程序集的业务层有关,这可能会导致问题?在这种情况下,我不应该从异常中获得警告或其他帮助吗?
提前致谢 > Shailendra