1

我使用 ASP.NET MVC4 应用程序。我正在尝试实现我自己的自定义成员资格提供程序,它继承自 SimpleMembership 提供程序类。

我的目标: 1. 使用自定义 NoSQL 数据存储。2. 在一个提供商中同时支持表单和 OAuth (Facebook) 身份验证。

我成功实现了用户自助注册和表单登录。不幸的是,在表单登录后,我在转到 /Account/Manage 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 中,我看到了一种返回用户 ID 的方法,该方法为 OAuth 用户调用,但不是为经过表单身份验证的用户调用的。

我的实施可能有什么问题?

谢谢。

4

1 回答 1

1

SimpleMembershipProvider专为与实体框架和 SQL Server 一起使用而构建。如果您想改用 NoSQL 存储,您应该创建自己的自定义 MembershipProvider,它继承自ExtendedMembershipProvider该类并实现您的功能工作所需的方法。其中相当一部分可以留UnimplementedException在对您的应用程序的其余部分没有任何负面影响的情况下。

于 2013-09-13T11:45:41.877 回答