0

Account Controller に正常にログインした後、_LoginPartial.cshtml をレンダリングして、navbar のテキストを「ログイン」から「ログアウト」に切り替えようとしました (「ログアウト」はフォームであり、反プライバシー トークンがあります。 RenderRazorViewToString を呼び出して部分ビューを呼び出し、それを ajax 応答に渡しますが、部分ビューでは「Request.Isauthenticated」が常に false であるため、テキストが「ログオフ」に変わることはありません認証のしくみを理解していないだけでしょうか?あるいは、Ajax 呼び出しからの偽造防止トークンと関係があるのか​​もしれません。

すべてのコードは以下です。

AccountController.cs

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> LoginJson(string email, string password, bool rememberme)
    {
        ..code here left blank

        var result = await SignInManager.PasswordSignInAsync
                     (userName, password, rememberme, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return Json(new { error = false, message = RenderRazorViewToString("_LoginPartial", null) });

            ..code here left blank
        }
    }

    private string RenderRazorViewToString(string viewName, object model)
    {
        if (model != null)
            ViewData.Model = model;

        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
                                                                     viewName);
            var viewContext = new ViewContext(ControllerContext, viewResult.View,
                                         ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }

_LoginPartial.cshtml

//Request.IsAuthenticated is false when calling it from RenderRazorViewToString
@if (Request.IsAuthenticated) { using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm"})) { @Html.AntiForgeryToken()

<ul class="nav navbar-nav navbar-right">
  <li>@Html.ActionLink("Create Yoga Band!", "Create", "YogaSpace")</li>
  <li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Menu<span class="caret"></span></a>
    <ul class="dropdown-menu" role="menu">
      <li>@Html.ActionLink("User", "UserProfile", "Account")</li>
      <li>@Html.ActionLink("Profiles", "Edit", "Student")</li>
      <li>@Html.ActionLink("Yoga Spaces", "Index", "YogaSpace")</li>
      <li><a href="#">Schedules</a>
      </li>
      <li><a href="#">Invite Friends!</a>
      </li>
    </ul>
  </li>
  <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
  </li>
</ul>
} } else {
<ul class="nav navbar-nav navbar-right">
  <li>@Html.ActionLink("Create Yoga Space!", "Create", "YogaSpace")</li>
  <li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>
  <li>@Html.ActionLink("Log in", "Login", "Account", routeValues: new { returnUrl = Request.RawUrl }, htmlAttributes: new { id = "loginLink" })</li>
</ul>
}

これは、コントローラーを押してログインするために私が行っているajax呼び出しです

LoginIntoStd: function(email, password, rememberme, antiForgeryToken,
  successCallback, failureCallback) {
  var data = {
    "__RequestVerificationToken": antiForgeryToken,
    "email": email,
    "password": password,
    "rememberme": rememberme
  };
  $.ajax({
      url: "/Account/LoginJson",
      type: "POST",
      data: data
    })
    .done(function(response) {
      if (response.error) {
        failureCallback(response.message);
      } else {
        successCallback(response.message);
      }
    })
    .fail(function(jqxhr, textStatus, errorThrown) {
      failureCallback(errorThrown);
    });
}

成功したコールバック メソッドは次のとおりです。

loginSuccess: function(message) {
  // close the modal
  $('#ModalLogin').modal('hide');
  // change the navbar items to show 'log out'
  $('#loginPartial').replaceWith(message);
}

4

1 に答える 1