我使用ASP.NET MVC4应用程序。 我正在尝试实现自己的自定义成员资格提供程序,继承自SimpleMembership提供程序类。
我的目标: 1.使用自定义NoSQL数据存储。 2.在单个提供程序中支持Forms和OAuth(Facebook)身份验证。
我成功实现了用户自行注册和表单登录。不幸的是,在表单登录后,我在转到/帐户/管理URL时遇到异常(通过点击用户名)。
例外在AccountController方法中:
public ActionResult Manage(ManageMessageId? message)
{
ViewBag.StatusMessage =
message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
: message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
: message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
: "";
ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
ViewBag.ReturnUrl = Url.Action("Manage");
return View();
}
收到的User.Identity.Name等于登录用户的用户名。
然而是对
的呼唤 WebSecurity.GetUserId(User.Identity.Name)
抛出和异常:
System.NullReferenceException was unhandled by user code
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=WebMatrix.WebData
StackTrace:
at WebMatrix.WebData.WebSecurity.GetUserId(String userName)
[continue stack]
在SimpleMembershipProvider中,我看到一种方法,用于返回为OAuth用户调用的用户ID,但不会为表单身份验证的用户返回。
我的实施可能出现什么问题?
感谢。
答案 0 :(得分:1)
SimpleMembershipProvider
专门用于与Entity Framework和SQL Server一起使用。如果您想要使用NoSQL存储,您应该创建自己的自定义MembershipProvider,它继承自ExtendedMembershipProvider
类,并实现您的功能所需的方法。其中相当一部分可以留下UnimplementedException
而不会对您的应用程序的其余部分产生任何负面影响。