【解決方法】Asp.net MVC returnurl 値は常に null

プログラミングQA


OK、これを投稿する前に(もちろん個別に)すべての提案を調査して試しましたが、毎回壁にぶつかりました

これは私のログイン ビューです。この問題に対する多くの回答で見たように、ViewBag を使用して ReturnUrl 値を渡しました。

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

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

そして、これはログインアクションの結果です

C#
[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 ファイルに追加した行です

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

そして、これを実行すると、実際にログインすることはありません。常にログインページに戻り、returnUrl の値は常に null です。
では、ここで何が起こっているのでしょうか????

私が試したこと:

この問題に関する多くの投稿を見て、ほとんどすべてを試しましたが、役に立ちませんでした..ここで助けていただければ幸いです

解決策 1

解決策についてはよくわかりませんが、次の 2 つのオプションを提供できます。

1) UserLogin クラスに returnUrl というプロパティを追加します。 次に、html フォームで、この値を使用して非表示タイプの入力を入力します (UserLogin に含めるため)。 明らかに、コントローラーでは UserLogin タイプのパラメーターを 1 つだけ受け取り、そこから returnUrl にアクセスできます。

2) パラメータ ReturnUrl (HTML コード内) と returnUrl (コントローラ内) を呼び出す代わりに、まったく同じケース (または両方の ReturnUrl または両方の returnUrl) で両方を呼び出します。

この提案がお役に立てば幸いです。

解決策 2

よく検索した後、ここで答えを見つけました
authentication – Asp.net MVC ReturnUrl値は常にnullです[^]

system.WebServer 内の web.config のモジュールにこれらの行を追加する必要がありました

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

コメント

タイトルとURLをコピーしました