ASP.NET MVC自定义成员资格提供程序“CreateUser”

时间:2010-01-10 21:25:59

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

我已经为我的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实现中没有完成......

3 个答案:

答案 0 :(得分:2)

我正在使用它(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 :(得分:1)

使用ILSpy查看静态方法Membership.CreateUser,您会发现它在

上执行验证
  • 用户名(修剪空白+非空,不为空)
  • 密码(修剪空格+非空,非空,长度检查)
  • 电子邮件(修剪空白)
  • 密码问题(修剪空白+非空)
  • 密码答案(修剪空白+非空)

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

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

Membership.CreateUser(...)

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

Membership.Provider.CreateUser(...)

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

虽然我的网站建议使用密码,但我们支持openid。因此,强制用户拥有密码似乎与openid有利的相反。

答案 2 :(得分:0)

完成重写

当调用诸如CreateUser之类的API时,ASP.NET成员系统总是对输入进行一些初始验证。

除了不直接使用ASP.NET成员资格API之外,我不知道有什么方法。