Управление входом в MVC не отображает имя пользователя после перенаправления создания учетной записи

Я работаю с настраиваемым поставщиком членства asp.net в сочетании с контроллером учетной записи по умолчанию, который поставляется с примером приложения asp.net MVC. Все идет гладко, за исключением одной крошечной вещи: после того, как пользователь создает учетную запись, автоматически входит в систему и перенаправляется, его имя пользователя не отображается с обычным приветственным сообщением.

Я подумал, возможно, это потому, что они не вошли в систему в то время, когда они сделали запрос. Как только они снова войдут в систему, их имя появится вверху, поэтому я не думаю, что это вина поставщиков членства, но я могу ошибаться.

Метод контроллера регистрации и перенаправления, поставляемый с asp.net MVC, выглядит следующим образом:

public ActionResult Register(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("Index", "Home");
        }
        else
        {
            ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus));
        }
    }

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

Кстати, это использует аутентификацию форм.

Изменить: вот главная страница, используемая страницей индекса. Это Site.master, который поставляется с приложением asp.net MVC по умолчанию:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

    <div id="header">
        <div id="title">
            <h1>Internship Site</h1>
        </div>

        <div id="logindisplay">
            <% Html.RenderPartial("LogOnUserControl"); %>
        </div> 

        <div id="menucontainer">

            <ul id="menu">              
                <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
                <li><%= Html.ActionLink("About", "About", "Home")%></li>
            </ul>

        </div>
    </div>

    <div id="main">
        <noscript>Your browser does not support JavaScript!</noscript>
        <asp:ContentPlaceHolder ID="MainContent" runat="server" />

        <div id="footer">
        </div>
    </div>
</div>

Любая помощь и понимание очень ценятся.


person Graham Conzett    schedule 21.08.2009    source источник
comment
отображается ли ваш вход в систему с помощью AJAX, и если да, вы в основном видите эту проблему в IE? Есть несколько трюков, чтобы заставить IE иногда правильно обновлять панели ajax.   -  person Russell Steen    schedule 24.08.2009
comment
В настоящее время я не использую AJAX. Я проводил большую часть тестирования в Firefox. Хорошая мысль, хотя я уже сталкивался с этим раньше.   -  person Graham Conzett    schedule 24.08.2009


Ответы (3)


Вы правы. Причина, по которой имя пользователя не отображается, заключается в том, что они не вошли в систему во время перенаправления на домашнюю страницу после создания учетной записи. Измените следующую строку:

FormsAuth.SignIn(userName, false /* createPersistentCookie */);

to:

FormsAuth.SignIn(userName, true /* createPersistentCookie */);
person MunkiPhD    schedule 21.08.2009
comment
Даже когда я создаю файл cookie, я получаю тот же результат. - person Graham Conzett; 21.08.2009
comment
Проверьте свои куки тогда. Вы пытались выполнить этот рабочий процесс с очищенными файлами cookie? - person MunkiPhD; 22.08.2009
comment
Я так понимаю, вы прошли через код - это очень странная проблема. Единственное, о чем я могу думать, это попробовать совершенно новый проект и ничего в нем не менять. Затем запустите его. Если у вас такая же проблема, значит, происходит что-то еще, и вы можете исключить код из проблемы. Это могут быть настройки браузера или какой-то другой специфический фактор, который где-то вызывает ошибку, но о которой не сообщается. - person MunkiPhD; 24.08.2009
comment
Это работает сейчас, необъяснимо! Я проследил его раньше, и все было нормально, я принял ваше предложение, открыл новый проект и проверил его, все работало нормально. Когда я снова открыл свой, это тоже сработало. Я понятия не имею, что может вызвать такое поведение, но, поскольку ваше предложение привело к тому, что я нашел решение, я отмечаю его как ответ. :) - person Graham Conzett; 25.08.2009
comment
это не кажется мне хорошим предложением, если только вы не хотите, чтобы вход в систему сохранялся даже после закрытия браузера. - person Simon_Weaver; 15.11.2009

Я делаю (вместо FormsAuth.SignIn())

if (Provider.ValidateUser(username, password)   
{  
     FormsAuth.SetAuthCookie(username, rememberMe);  
}  

где запомнить меня — переменная, указывающая значение флажка «запомнить меня» (true, false)

Редактировать: я только что увидел, что это в регистрации. Я все еще использую .SetAuthCookie, но, очевидно, не использую .ValidateUser (в моем регистрационном коде).

person Russell Steen    schedule 21.08.2009
comment
К сожалению, это дает тот же результат. - person Graham Conzett; 24.08.2009
comment
Можете ли вы показать код домашнего индекса, на который вы перенаправляетесь? - person Russell Steen; 24.08.2009
comment
Я добавил главную страницу, используемую представлением индекса, в свой исходный пост. Сам вид — это просто заполнитель. - person Graham Conzett; 24.08.2009
comment
Извините, я имел в виду код действия. Мне там было не очень понятно. Позвольте мне еще немного изучить мой проект, и я посмотрю, что я могу узнать. Дайте нам знать, если вы решите это. - person Russell Steen; 24.08.2009
comment
О, ладно, извините, код действия индекса домашнего контроллера, на которое он перенаправляется, выглядит следующим образом: public ActionResult Index() { ViewData[Message] = Welcome to ASP.NET MVC!; вернуть вид(); } - person Graham Conzett; 24.08.2009

Обычный процесс проверки пользователя и автоматического входа в систему выглядит следующим образом:

        public ActionResult Login(string userName, string password, bool persistent, string returnUrl)
    {

        if (returnUrl != null && returnUrl.IndexOf("/user/login", StringComparison.OrdinalIgnoreCase) >= 0)
            returnUrl = null;

        if (Membership.ValidateUser(userName, password))
        {
            FormsAuthentication.SetAuthCookie(userName, persistent);

            if (!String.IsNullOrEmpty(returnUrl))
                return this.Redirect(303, returnUrl);
            else
                return this.Redirect(303, FormsAuthentication.DefaultUrl);
        }
        else
            TempData["ErrorMessage"] = "Login failed! Please make sure you are using the correct user name and password.";
        return View();
    }
person Sergey Kravchenko    schedule 22.12.2009