我将 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
我已经实现了基本的东西( View 和逻辑),但是当我调用
WebSecurity.GeneratePasswordResetToken(userName);
我得到以下异常。
我在 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:
至少阅读了 google 上的前 10 个帮助链接和 SO 上的 5 个似乎与此主题相关的答案,例如
To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider"
实际上不明白他是如何通过答案中提到的原因解决错误的。 “ActionExecutingContext”不在“System.Web.Http”中。
你们中的任何人都可以建议我可以尝试摆脱这个异常(exception)的其他事情吗?
我知道这应该对我有用,只是对时间> 2 小时感到恼火我不得不浪费解决此类问题(当时使用 SimpleMembership 并使用我自己的身份验证机制进行报废)。
更新: 问题解决了。解决此异常的更改是,我在业务层项目中引用了 WebMatrix.WebData 程序集版本 1.0,我将其替换为程序集版本 2.0。我在其他项目程序集 (DAL) 中也使用了 2.0 版程序集。
我比较了 WebMatrix.WebData 程序集的两个版本,但是在所讨论的代码中没有发现任何差异。所以不确定为什么它无法将提供者强制转换为“ExtendedMembershipProvider”?
这可能与因为其他项目,尤其是 web 项目正在加载 2.0 版和使
WebSecurity.GeneratePasswordResetToken
寻找 1.0 程序集的业务层有关,它可能会导致问题吗?在那种情况下,我不应该从异常中得到警告或其他帮助吗?提前致谢 > Shailendra
最佳答案
解决此异常的更改是,我在我的业务层项目中引用了 WebMatrix.WebData 程序集版本 1.0,我将其替换为程序集版本 2.0。
当我比较 WebMatrix.WebData 程序集的两个版本时,我找不到相关代码的任何差异。
然而,我已经在另一个项目程序集 (DAL) 中使用了 2.0 版程序集这一事实。
因此,虽然我不是 100% 确定我的理论是,但在运行时检查提供程序时,由于冲突,它无法加载正确的程序集(一个版本已经加载,在 DAL 项目中引用,当调用第二个项目方法时,它引用了一个相同程序集的不同版本),它显示通用异常消息。