【问题标题】:I cannot figure out how to use the SimpleMembershipProvider.GetUserNameByEmail Method我不知道如何使用 SimpleMembershipProvider.GetUserNameByEmail 方法
【发布时间】:2013-06-27 14:26:29
【问题描述】:

这是一个 MVC 4 互联网应用程序。我已经在 Web.config 文件中将 Role Provider 和 Role Manager 设置为 SimpleRoleProvider 和 SimpleMembershipProvider ,但我继续得到“在调用“WebSecurity”类的任何其他方法之前必须调用“WebSecurity.InitializeDatabaseConnection”方法”尽管在 Global,asax.cs 文件中初始化了 WebSecurity.InitializeDatabaseConnection 异常。我知道这已正确初始化,因为我创建并以编程方式分配的授权属性中的角色属性工作完美。我要做的就是检索用户用户名,如果他们忘记并且无法登录,则通过电子邮件将其发送给他们。建议表示赞赏。

    [HttpPost]
    [CaptchaVerify("Captcha is not valid")]
    [AllowAnonymous]
    public ActionResult ForgotUserNameOrPassword(UserProfile model, FormCollection collection)
    {

        if (!ModelState.IsValid)
        {
            ViewBag.Error = "The Captcha answer is incorrect";
            return View();
        }
        else
        {


            SimpleMembershipProvider mySMP = new SimpleMembershipProvider();

            int outRecs;

            dynamic email = new Postal.Email("UserNameEmail");


            MembershipUserCollection myUserCol =mySMP.FindUsersByEmail(model.UserEmail, 0, 0, out outRecs);

            email.Username = myUserCol;
            email.To = model.UserEmail;
            email.From = model.UserEmail;
            email.Send();

            return View("../Account/Login");

        }
    }

【问题讨论】:

  • 您不会以这种方式实例化 SimpleMembershipProvider。您只需说 Membership.Provider,这将为您提供已经实例化的提供程序。但是,除此之外,您的问题是这些方法不是由 SimpleMembershipProvider 实现的。所以你将不得不简单地手动查询数据库。

标签: asp.net-mvc-4 simplemembership


【解决方案1】:

即使您确实正确调用了 InitializeDatabaseConnection,它也不适用于 SimpleMembershipProvider.FindUsersByEmail。这是此方法的文档中的注释。

如果 SimpleMembershipProvider 类已使用调用 WebSecurity.InitializeDatabaseConnection() 方法进行了初始化,则此方法不受支持,将引发 NotSupportedException 异常。但是,如果尚未调用 WebSecurity.InitializeDatabaseConnection() 方法,并且您已将站点配置为使用标准 ASP.NET 成员资格提供程序,则此方法将传递给标准成员资格提供程序。有关详细信息,请参阅 SimpleMembershipProvider 类概述。

鉴于文档,您所经历的一切没有任何意义。究竟是在哪里抛出异常?当您调用 FindUsersByEmail 时?

2013 年 6 月 28 日更新

SimpleMembershipProvider 未实现所有标准提供程序方法。如果缺少一种方法,您有几个选择。首先,您可以创建自己的自定义 SimpleMembershipProvider,它从具有您需要的方法的原始版本派生而来。或者,您可以扩展 WebSecurity 类以包含您需要的方法。看看SimpleSecurity 开源项目decouples SimpleMembership from the ASP.NET MVC application。这个article describes how to extend the WebSecurity class 直接查询数据库。您可以执行类似的操作并通过电子邮件地址查询特定用户。

但 SimpleMembership 不支持开箱即用地存储用户电子邮件地址。看看这个article on how to customize SimpleMembership to include the email address

另外请记住,基本成员资格提供商返回多个用户的电子邮件地址的原因是该架构不限制用户使用相同的电子邮件地址开设多个帐户,除非该电子邮件地址用作用户名.

【讨论】:

  • FindUsernameByEmail 调用从一开始就不正确,因为它引入了一组用户名,而不是我需要向用户发送电子邮件的特定用户名。我现在通过将 model.UserEmail 传递给它的参数并将其设置为 email.UserNmame 来使用 Membership.GetUserNameByEmail 调用。我得到的例外是“不支持指定的方法”。因为那是属于 MembershipProvider 的方法。我想使用 SimpleMembershipProvider,但可以访问 Membership Provider 中的一些方法。
  • 调用 Membership.GetUserByEmail() 时出现异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2016-12-13
  • 2022-11-11
  • 1970-01-01
  • 2017-02-08
  • 2016-01-14
  • 2015-09-14
相关资源
最近更新 更多