RashaSalim Ответов: 2

Asp.net MVC returnurl value всегда null


Хорошо, я исследовал и попробовал каждое предложение (индивидуально, конечно), прежде чем опубликовать это, и каждый раз я натыкался на стену

Это мое представление входа в систему я использовал ViewBag для передачи значения ReturnUrl как я видел во многих ответах на эту проблему

<h2>Login</h2>
    @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { role = "form" }))
    {
        @Html.AntiForgeryToken()
  

      ...............


И это результат действия входа в систему

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(UserLogin login, string returnUrl="")
    {
        string message = "";
        using (NerdsContext nc = new NerdsContext())
        {
            var v = nc.User.Where(a => a.email == login.email).FirstOrDefault();
            if (v != null)
            {
                if (!v.IsEmailVerified)
                {
                    ViewBag.Message = "Please verify your email first";
                    return View();
                }
                if (string.Compare(Crypto.Hash(login.password), v.password) == 0)
                {
                    int timeout = login.rememberMe ? 525600 : 20; // 525600 min = 1 year
                    var ticket = new FormsAuthenticationTicket(login.email, login.rememberMe, timeout);
                    string encrypted = FormsAuthentication.Encrypt(ticket);
                    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
                    cookie.Expires = DateTime.Now.AddMinutes(timeout);
                    cookie.HttpOnly = true;
                    Response.Cookies.Add(cookie);

                    //Redirect the user to new url
                    if (Url.IsLocalUrl(returnUrl))
                    {
                        ViewBag.ReturnUrl = returnUrl;
                        return Redirect(returnUrl);
                       
                    }
                    else
                    {
                        return RedirectToAction("Nerd", "Home");
                    }
                }
                else
                {
                    message = "Invalid credential provided";
                }
            }
            else
            {
                message = "Invalid credential provided";
            }
        }
        ViewBag.Message = message;
        return View();
    }

И, наконец, это строки, которые я добавил в файл web.config

<authentication mode="Forms">
          <forms cookieless="UseCookies"  loginUrl="/Account/Login"  timeout="30" slidingExpiration="true" protection="All"></forms>
        </authentication>

И когда я запускаю это я никогда не получаю фактически войти в систему он всегда отправляет меня обратно на страницу входа в систему и значение returnUrl всегда равно null
Так что же здесь происходит????


Что я уже пробовал:

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

2 Ответов

Рейтинг:
7

RashaSalim

Хорошо после долгих поисков я нашел свой ответ здесь
аутентификация - Asp.net MVC ReturnUrl value always null-переполнение стека[^]


Мне пришлось добавить эти строки в модули моего web.config внутри системы.web-сервер

<remove name="FormsAuthentication" />
          <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />


Рейтинг:
1

Member 7870345

Я не очень уверен в решении, но могу предложить вам два варианта:

1) в свой класс UserLogin добавьте свойство returnUrl. Затем в html-форме пуэт ввод типа hidden whit этого значения (для того, чтобы быть включенным в UserLogin). Очевидно, что в контроллере вы получите только один параметр типа UserLogin, и оттуда вы сможете получить доступ к returnUrl.

2) вместо того, чтобы вызывать ваши параметры ReturnUrl (в вашем html-коде) и returnUrl (в контроллере), вызовите оба с точно таким же случаем (или оба ReturnUrl или оба returnUrl).

Я надеюсь, что эти предложения помогут вам.


RashaSalim

Большое спасибо за ваш ответ я попробую это сделать и дам вам знать что произойдет

RashaSalim

Хорошо, теперь есть прогресс, обратный Url-адрес имеет значение, но все равно мой пользователь перенаправляется на страницу входа в систему, как если бы он не предоставлял аутентификацию...Я думаю, что часть проблемы заключается в отсутствии полного понимания от моего имени, я публикую это на другом форуме, и кто-то указал, что у меня нет кода для входа пользователя в систему
у вас есть еще какие-нибудь идеи?
Спасибо

Member 7870345

Мне очень жаль, но я не понимаю, что вы имеете в виду.
Чтение кода есть несколько случаев:
а)является недействительным пользователем, то ViewBag.Сообщение = "неверные учетные данные предоставлены" , и снова отображается представление входа в систему (с помощью ViewBag.Сообщение = = " неверные учетные данные предоставлены")
Б)является действительным пользователем, и электронная почта не проверена, то ViewBag.Сообщение = "пожалуйста, сначала проверьте свою электронную почту", и снова появится представление входа в систему (с помощью ViewBag.Сообщение = = " пожалуйста, сначала проверьте свою электронную почту")
В) является действительным пользователем, а затем проверяется электронная почта и пароль в порядке, затем устанавливается файл cookie с идентификацией и
c. 1) Если returnUrl является локальным, то пользователь перенаправляется на returnUrl
c. 2) Если returnUrl не является локальным, то пользователь перенаправляется на RedirectToAction("Nerd", " Home");
d) является действительным пользователем, а затем электронная почта проверяется, и пароль не в порядке, а затем ViewBag.Сообщение = "неверные учетные данные предоставлены" , и снова отображается представление входа в систему (с помощью ViewBag.Сообщение = = "неверные учетные данные предоставлены").

Какого поведения вы хотите? Каковы различия между вашими запросами и кодом?

RashaSalim

Я использовал отладчик, и все выглядит нормально, он фактически выполняет оператор if (Url.IsLocalUrl(ReturnUrl))
и это url-адрес в браузере
http://localhost:49408/Account/Login?ReturnUrl=%2FHome%2FNerd

но он никогда не переходит на (/Home/Nerd), он возвращается на страницу входа без какого-либо сообщения displayed...so как вы думаете, почему пользователь не предоставляет доступ к странице
это метод действия Ботаника в домашнем контроллере
[Авторизовать]
публичные действия ботаника()
{
возвращение смотреть();
}

Member 7870345

Пожалуйста, поставьте точку останова в предложении "если (URL-адрес.IsLocalUrl(returnurl В))" и еще одну точку останова "общественная ActionResult Умник()".
Затем выполните код и посмотрите, каково значение "ReturnUrl" (пожалуйста, сообщите в сообщении это значение). Пусть код продолжает выполняться и наблюдает, выполняется ли вторая точка останова (в public ActionResult Nerd ()) или нет.