这是一个MVC 4 Internet应用程序。我已将角色提供程序和角色管理器设置为Web.config文件中的SimpleRoleProvider和SimpleMembershipProvider,但我继续获得“在调用”WebSecurity“类的任何其他方法之前必须调用”WebSecurity.InitializeDatabaseConnection“方法”尽管在Global,asax.cs文件中初始化WebSecurity.InitializeDatabaseConnection仍然存在异常。我知道这是正确初始化的,因为我创建的授权属性中的Roles属性和编程工作分配完美。我想要做的就是检索用户用户名,如果他们忘记并且无法登录,则通过电子邮件发送给他们。建议表示赞赏。
[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");
}
}
答案 0 :(得分:1)
即使您确实正确调用了InitializeDatabaseConnection,它也不适用于SimpleMembershipProvider.FindUsersByEmail。以下是此方法的文档中的注释。
如果使用对WebSecurity.InitializeDatabaseConnection()方法的调用初始化SimpleMembershipProvider类,则不支持此方法,并将抛出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。
另请注意,基本成员资格提供程序为电子邮件地址返回多个用户的原因是该架构不会限制用户使用相同的电子邮件地址打开多个帐户,除非该电子邮件地址用作用户名。