【问题标题】:ASP.NET MVC Custom Membership Provider "CreateUser"ASP.NET MVC 自定义成员资格提供程序“CreateUser”
【发布时间】:2010-01-10 21:25:58
【问题描述】:

我已经为我的 ASP.NET MVC 应用程序实现了一些基本的自定义成员资格提供程序,因此我认为所有验证都将在我的自定义代码中完成。

不幸的是,当我试图通过调用函数来创建新用户时:

Membership.CreateUser(user.UserName, user.Password, user.Email, null, null, true, Guid.NewGuid(), out status);

这最终应该抛出一个带有所有验证错误的异常我得到一个类似“InvalidUserName”或“InvalidPassword”的状态...这意味着我的自定义 CreateUser 函数不是直接调用,它是在我希望跳过的一些基本验证之后使用的。

我的 CreateUser 函数(在我的自定义提供程序中):

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
    try
    {

        User user = new User();
        user.UserKey = Guid.NewGuid();
        user.UserName = username;
        user.passwordSalt = string.Empty;
        user.Password = this.TransformPassword(password, ref user.passwordSalt);
        user.Email = email;
        user.PasswordQuestion = passwordQuestion;
        user.PasswordAnswer = passwordAnswer;
        user.CreationDate = DateTime.Now;
        user.LastActivityDate = DateTime.Now;
        user.LastLoginDate = DateTime.MinValue;
        user.LastPasswordChangeDate = DateTime.Now;

        this._UsersRepository.SaveUser(user);

        status = MembershipCreateStatus.Success;
        return CreateMembershipFromInternalUser(user);


    }
    catch(RuleException ex)
    {
        throw ex;
    }
}

你知道如何强制直接使用自定义 CreateUser 函数吗!?


但我没有使用默认的 ASP.NET MVC 项目的 AccountController...

看看吧:

[AcceptVerbs(HttpVerbs.Post)]
public ViewResult Register(User user, string password_confirm, bool acceptsTerms)
{
    if (!acceptsTerms)
        ModelState.AddModelError("acceptsTerms", "Musisz zaakceptować regulamin");

    if (ModelState.IsValid)
    {
        try
        {
            MembershipCreateStatus status = new MembershipCreateStatus();
            Membership.CreateUser(user.UserName, user.Password, user.Email, null, null, true, Guid.NewGuid(), out status);
        }
        catch (RuleException ex){
            ex.CopyToModelState(ModelState,"user");
        }
    }

    return View();
}

关键是当 user.UserName 或 user.Password 为空时,我得到一个状态而不是 RuleException ex。我的自定义 RuleException ex 也会给我这些信息。现在在哪里分配状态值!? Bacouse 它没有在我的 CreateUser 实现中完成......

【问题讨论】:

    标签: asp.net-mvc asp.net-membership


    【解决方案1】:

    我正在使用这个 (MVC3),我没有任何问题:

    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            MembershipCreateStatus status;
            Membership.Provider.CreateUser(model.UserName, model.Password, model.Email, "", "", true, Guid.NewGuid(), out status);
    
            if (status == MembershipCreateStatus.Success)
            {
                FormsService.SignIn(model.UserName, false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", AccountValidation.ErrorCodeToString(status));
            }
        }
    
        // If we got this far, something failed, redisplay form
        ViewBag.PasswordLength = MembershipService.MinPasswordLength;
        return View(model);
    }
    

    【讨论】:

    • +1,对于通过 Membership.Provider 访问我的自定义提供程序的 MVC3 项目,对我来说也非常有效。
    【解决方案2】:

    使用ILSpy查看静态方法Membership.CreateUser,你会发现它执行了验证

    • 用户名(修剪空格+不为空,不为空)
    • 密码(修剪空格 + 非空、非空、长度检查)
    • 电子邮件(修剪空白)
    • 密码问题(去掉空格+不为空)
    • 密码答案(去掉空格+不为空)

    然后它调用自定义提供程序。

    这里的关键是不要调用静态方法CreateUser

    Membership.CreateUser(...)
    

    而是直接使用以下方式调用自定义提供程序:

    Membership.Provider.CreateUser(...)
    

    从 .NET 4 开始经过测试和验证

    虽然我的网站建议设置密码,但我们支持 openid。因此,强制用户输入密码似乎与 openid 的优点背道而驰。

    【讨论】:

      【解决方案3】:

      完全重写

      在调用 CreateUser 等 API 时,ASP.NET 成员系统总是对输入进行一些初始验证。

      除了不直接访问 ASP.NET 成员 API 之外,我不知道有任何解决方法。

      【讨论】:

        猜你喜欢
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多