web-dev-qa-db-ja.com

MVC 4でReturnUrl = ViewBag.ReturnUrlを使用する方法

「ASP.NET MVC 4」アプリケーションに取り組んでいます。 SimpleMembershipProviderを使用/学習し、VS2012で作成されたデフォルトロジックにInternet templateで固執しようとしています(間違えなければ、 'SimpleMembershipProvider'をそのまま使用します)。

私はAccountControllerにこだわっています。このメソッドをどのように使用できるかを正確に把握することはできません。

private ActionResult RedirectToLocal(string returnUrl)
        {
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

私が理解していることから、あなたがログインすることを決めた場所(私がまさに達成したいこと)にリダイレクトされるということです。ビューでどのように使用されているかを見てみました:

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

実際にViewBag.ReturnUrlが何らかの値で設定されている場所を探してください。このメソッドはここにしかありません。

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

そして、場所/ URLを正確に取得する方法についてかなり混乱しています。私はいくつかのブレークポイントを設定しましたが、returnUrlnullとは異なることを見たことはありません。 )。

だから私は本当にこれがどのように機能するのか理解できません。宿題をしようとしたことを示すために上記を投稿しました。できる限り調査しましたが、答えが見つからなかったので、ここで尋ねます。これが実際にどのように機能するかについて説明/例を提供できますか?

39
Leron

フォーム認証を使用し、ユーザーが認証または承認されていない場合、ASP.NETセキュリティパイプラインはログインページにリダイレクトし、クエリ文字列のパラメーターとしてreturnUrlをリダイレクトしたページに渡しますログインページ。ログインアクションはこのパラメーターの値を取得し、ViewBagに入れて、ビューに渡すことができるようにします。

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

次に、ビューのこのコード行が示すように、ビューはこの値をフォームに保存します。

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

ビューに保存される理由は、ユーザーがユーザー名とパスワードを入力した後に送信を行うと、ポストバックを処理するコントローラーアクションがこの値にアクセスできるようにするためです。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }

モデルの状態が有効で、WebSecurity.Loginメソッドを呼び出して認証されている場合、returnUrlの値でメソッドRedirectToLocalを呼び出しますビューから作成されたもので、元はビューを作成したログインアクションから作成されたものです。

デフォルトのレイアウトでページの上部にあるログインリンクをクリックする場合のように、ユーザーがログインページにリダイレクトされない場合、returnUrl値はnullになります。この場合、ログインに成功すると、ユーザーはホームページにリダイレクトされます。 returnUrlの全体的な目的は、ユーザーが認証/承認される前にアクセスしようとしたページにユーザーを自動的に送り返すことです。

62
Kevin Junghans

これは、デフォルトのASP.NET MVCテンプレートが フォーム認証 を使用しており、コントローラーが[Authorize]属性で装飾されているためです。

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

[Authorize]
public class AccountController : Controller
{
    //...
}

これは、ユーザーが認証されない場合、フォーム要素のLoginUrl属性で定義されたログオンページにリダイレクトされることを意味します。

リダイレクト中、FormsAuthenticationであるHttpModuleは、クエリ文字列で要求されたURLを自動的に追加します。

したがって、/Account/Loginに移動すると、[AllowAnonymous]属性で装飾されているため、クエリ文字列には何も表示されません。ただし、/Account/Manageに移動すると、クエリ文字列のreturnUrlが/Account/Manage(/Account/Login?ReturnUrl=%2fAccount%2fManage)になっていることがわかります。

したがって、returnUrlを設定するのではなく、フレームワークがそれを行います。ユーザーを認証した後、ユーザーをリダイレクトする場所を知るために、AccountControllerでそれを使用します。

12
Davor Zlotrg

認証されていないユーザーが認証を必要とするアプリケーションのセクションにアクセスしようとすると、returnUrlが表示されます。認証されていないユーザーがリクエストしたURLは、基本的にreturnUrlに保存されます。

PluralSightチュートリアル:ASP.NET MVC 4を使用したアプリケーションの構築

4
Aritra B