Поставщик пользовательского членства ASP.NET MVC "CreateUser" - PullRequest
1 голос
/ 11 января 2010

Я реализовал некоторый базовый пользовательский поставщик членства для своего приложения 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!?


Но я не использую AccountController проекта ASP.NET MVC по умолчанию ...

Просто взгляните:

[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();
}

Дело в том, что я получаю статус вместо RuleException ex, когда user.UserName или user.Password пусто. Мой пользовательский RuleException ex также вернул бы мне такую ​​информацию. Где значение статуса назначается прямо сейчас!? Bacouse это не сделано в моей реализации CreateUser ...

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Я использую это (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 голос
/ 26 апреля 2012

Используя ILSpy для просмотра статического метода Membership.CreateUser, вы обнаружите, что он выполняет проверку на

  • Имя пользователя (обрезать пробел + не пусто, не пусто)
  • Пароль (обрезать пробел + не ноль, не пусто, проверка длины)
  • Электронная почта (обрезать пробелы)
  • Вопрос о пароле (пробел + обрезка не пуст)
  • Пароль Ответ (обрезать пробел + не пусто)

Затем вызывается пользовательский поставщик.

Ключ в том, чтобы не вызывать статический метод CreateUser

Membership.CreateUser(...)

Скорее, позвоните специальному провайдеру напрямую, используя:

Membership.Provider.CreateUser(...)

Проверено и проверено работает, начиная с .NET 4

Хотя мой сайт рекомендует иметь пароль, мы поддерживаем openid. Поэтому принуждение пользователя иметь пароль просто противоречило тому, что хорошо для openid.

0 голосов
/ 11 января 2010

Полная перезапись

Система членства ASP.NET всегда выполняет начальную проверку входных данных при вызове таких API, как CreateUser.

Я не знаю никакого способа, кроме как не переходить напрямую к API членства в ASP.NET.

...