4

我将 SimpleMembership 用于基于 ASP.NET MVC4 的应用程序。我通过在互联网上关注一些博客来设置身份验证机制。仅作为背景,以下是亮点:

• 我有一个初始化成员资格的类“InitializeSimpleMembershipAttribute”。确保在第一次调用 WebSecurity 类的任何方法之前调用它。

• 我有一个SeedData 类,它成功地利用WebSecurity 创建了默认用户和角色(DB 获取默认数据)。

• 当前状态下的应用程序允许用户登录并使用他有权访问的功能。因此,我认为我们可以说 SimpleMembership 设置正确并且工作正常。

• 现在我正在添加“重置密码”功能。我关注了一些博客,例如

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(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

4

2 回答 2

4

解决此异常的更改是,我在业务层项目中引用了 WebMatrix.WebData 程序集版本 1.0,我将其替换为程序集版本 2.0。

当我比较两个版本的 WebMatrix.WebData 程序集时,我没有发现有问题的代码有任何区别。

然而,我已经在另一个项目程序集 (DAL) 中使用了 2.0 版程序集这一事实。

因此,虽然我不是 100% 确定我的理论是,但在运行时检查提供程序时,由于冲突而无法加载正确的程序集(已经加载了一个版本,该版本在 DAL 项目中被引用,并且当调用第二个项目方法时,它引用了一个同一程序集的不同版本)并且它显示通用异常消息。

于 2013-08-23T06:06:31.407 回答
3

我必须删除所有项目中的所有 WebMatrix.Data 和 WebMatrix.WebData 引用,然后使用 Copy Local = true 将它们重新添加,然后一切正常。确保您拥有正确的版本号!v2.东西。

于 2013-08-16T16:36:34.193 回答