我将 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 项目中引用,当调用第二个项目方法时,它引用了一个相同程序集的不同版本),它显示通用异常消息。

10-08 03:06