加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

身份验证 – 错误“Membership.Provider”属性必须是“ExtendedM

发布时间:2020-12-16 06:32:40 所属栏目:asp.Net 来源:网络整理
导读:我使用SimpleMembership作为基于ASP.NET MVC4的应用程序.我通过在互联网上关注几个博客来设置认证机制.仅供以下背景介绍: ?我有一个初始化成员资格的“InitializeSimpleMembershipAttribute”类.确保在首次调用WebSecurity类的任何方法之前调用此方法. ?我
我使用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(用户名);

我得到以下例外.

To call this method,the “Membership.Provider” property must be an instance of “ExtendedMembershipProvider”.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: To call this method,the “Membership.Provider” property must be an instance of “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,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:
添加< add key =“enableSimpleMembership”value =“true”/>在web.config文件中.

尝试4:
至少阅读了谷歌上的前10个帮助链接和5个与此主题相关的答案,例如
To call this method,the “Membership.Provider” property must be an instance of “ExtendedMembershipProvider”
实际上并不明白他是如何通过答案中提到的理由解决错误的. “ActionExecutingContext”不在“System.Web.Http”中.

你们中的任何一个人都可以提出其他我可以尝试摆脱这个例外的事情吗?

我知道这对我来说应该对我有用,并且对时间感到烦恼> 2小时我不得不浪费解决这个问题(使用SimpleMembership并使用我自己的身份验证机制进行废弃处理).

更新:问题解决了.解决此异常的更改是,我在我的业务层项目中引用了WebMatrix.WebData程序集版本1.0,我将其替换为程序集版本2.0.我有其他项目程序集(DAL)中使用的2.0版程序集.

我比较了两个版本的WebMatrix.WebData程序集但是找不到有问题的代码的任何差异.所以不确定为什么它没有将提供者强制转换为“ExtendedMembershipProvider”?

是否与之相关,因为其他项目尤其是Web项目正在加载2.0版,而业务层正在使WebSecurity.GeneratePasswordResetToken查找1.0程序集,这可能会导致问题?在这种情况下,我不应该从例外中获得警告或其他帮助吗?

提前致谢>赛伦德拉

解决方法

解决此异常的更改是,我将其替换为程序集版本2.0.

当我比较两个版本的WebMatrix.WebData程序集时,我找不到有问题的代码的任何差异.

但是,我已经在另一个项目程序集(DAL)中使用了2.0版程序集.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读