Как остановить MembershipService.CreateUser () от автоматического входа в ASP.NET MVC? - PullRequest
2 голосов
/ 15 июля 2009

Я создал приложение с ASP.NET MVC 1.0 и хочу использовать пользовательский метод (для администраторов) для создания пользователя. Я взял метод Register (в контроллере учетной записи) и переименовал его в Create. Затем я закомментировал строку FormsAuth.SignIn (userName, false); , чтобы новый пользователь не мог войти в систему.

Когда я заполняю форму создания пользователя, пользователь отлично добавляется, но он также входит в систему. Теперь вошли и я, и новый пользователь. Я знаю это, потому что моя страница ListUsers тестирует для user.IsOnline

ОБНОВЛЕНИЕ (2009-07-15 14:40): Я занимался Google и обнаружил, что User.IsOnline не очень надежен из-за HTTP-протокола без сохранения состояния. Примечание: если я перехожу на страницу UserDetails (которая заполняется с помощью MembershipUserAndRolesViewData), последний вход в систему отображается как NULL. Но моя страница ListUsers показывает дату входа в систему ... ???


public class AccountController : Controller
{

// ...

[Authorize(Roles = "Administrator")]    
[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(string userName, string email, string password, string confirmPassword)
        {

            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;


            if (ValidateRegistration(userName, email, password, confirmPassword))
            {

                // Attempt to register the user
                MembershipCreateStatus createStatus = MembershipService.CreateUser(userName, password, email);

                if (createStatus == MembershipCreateStatus.Success)
                {
                    //FormsAuth.SignIn(userName, false); // createPersistentCookie 
                    return RedirectToAction("ListUsers", "Account");
                }
                else
                {
                    ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            return View();

        }
}

Ответы [ 3 ]

2 голосов
/ 23 июля 2009

Проверка http://msdn.microsoft.com/en-us/library/system.web.security.membershipuser.isonline.aspx упоминает это:

Пользователь считается подключенным к сети, если текущая дата и время минус значение свойства UserIsOnlineTimeWindow раньше, чем LastActivityDate для пользователя.

LastActivityDate для пользователя обновляется до текущей даты и времени методами CreateUser, UpdateUser и ValidateUser и может обновляться некоторыми перегрузками метода GetUser.

Эта страница http://msdn.microsoft.com/en-us/library/system.web.security.membershipuser.lastactivitydate.aspx также говорит это:

LastActivityDate для пользователя обновляется до текущей даты и времени методами CreateUser и ValidateUser и может обновляться при некоторых перегрузках метода GetUser. Вы можете использовать метод UpdateUser, чтобы установить для свойства LastActivityDate определенную дату и время.

Так что, похоже, что при создании новой учетной записи это считается «Онлайн». Обходным путем может быть изменение значения по умолчанию CreateUser в классе AccountMembershipService для сброса даты при создании учетной записи:

    public MembershipCreateStatus CreateUser(string userName, string password, string email)
    {
        MembershipCreateStatus status;
        MembershipUser user = _provider.CreateUser(userName, password, email, null, null, true, null, out status);
        user.LastActivityDate = DateTime.MinValue; //set the LastActivityDate to a point far back in the past
        _provider.UpdateUser(user); //update the user to the MembershipProvider
        return status;
    }
0 голосов
/ 15 июля 2009

Это что-то вроде взлома, но я полагаю, вы могли бы выйти из них, прежде чем перенаправлять их.

FormsAuth.SignOut();    
return RedirectToAction("Index", "Home");
0 голосов
/ 15 июля 2009

Должно быть что-то не так с кодом, который вы не показывали. Если вы создаете новый проект ASP.NET MVC с использованием шаблона VS по умолчанию, а затем закомментируете строку FormsAuth.SignIn(userName, false), пользователь не вошел в систему, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...