Не удается связаться с контроллером / действием при нажатии кнопки выхода из системы - PullRequest
1 голос
/ 11 июня 2019

Я использовал шаблон MVC в приложении и изменил его по мере необходимости.При нажатии кнопки «Выход» я должен быть в состоянии выполнить действие выхода из системы, где я определяю логику выхода из системы.Но когда я нажимаю кнопку, она сразу выводит меня на экран входа в систему, не затрагивая действие выхода из системы в контроллере.

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

Вот представление и действие контроллера.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        //AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        return RedirectToAction("Login", "Account");
    }

Частичное представление, встроенное в макет:

    @if (1==1)
    {
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" }))
{
    @Html.AntiForgeryToken()  

    <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <p class="navbar-text">Allturna's Insights Portal</p>
    </div>
    <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li>@Html.ActionLink("Home", "Index", "Home")</li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li>
                    <p class="navbar-text">Hello!</p> @*Use username here from viewdata*@
                </li>
                <li>
                <li>
                    @Html.ActionLink("Tenants", "GetTenant", "Home", new { ReturnUrl = ViewBag.ReturnUrl }, null)
                </li>
                <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
                <li><img src="~/Content/Image/Allturna_logo.png" height="50" width="220" /></li>
            </ul>
    </div>
}

}

RouteConfig.cs выглядит следующим образом:

    public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
        );
    }
}

Мне не удалось выяснить, почему кнопка выхода из системы может нажать кнопку / отправить формуне доходить до выхода из системы.Буду признателен за любую помощь.

Поскольку я работаю над этим, я хотел добавить некоторые дополнительные заметки.Если я использую шаблон aspnet по умолчанию с идентификатором, он достигает кнопки выхода из системы.Но я пытаюсь реализовать свою собственную логику входа и выхода без использования Identity.Вот когда то не выйдет из системы.

Я разместил обе логические (с / без идентификатора) обращения к выходу из системы, как и ожидалось.

С Identity работает следующее:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                //Add tenantId to session from user info (temporary testing with Allturna)
                Session["TenantId"] = 1;
                Session["AccessToken"] = "my token";
                return RedirectToLocal(returnUrl);

            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

, когда я использую следующую логику входа в систему (без идентификации), при выходе из системы не происходит попадание.

            [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        //get the authentication URL
        string strJwtToken = string.Empty;
        string strAuthenticationUrl = ConfigurationManager.AppSettings.Get("AuthenticationServerEndPoint");
        if (String.IsNullOrEmpty(strAuthenticationUrl))
            throw new Exception("Authentication Endpoint is not specified.");

        ServiceClient client = new ServiceClient(strAuthenticationUrl, "Authenticate");
        dynamic objAuthentication = new ExpandoObject();
        objAuthentication.UserName = model.Email;
        objAuthentication.Password = model.Password;
        client.AddJsonBody(objAuthentication);
        HttpStatusCode httpReturnCode = client.Post(out strJwtToken);

        if (httpReturnCode == HttpStatusCode.OK)
            Session["AccessToken"] = strJwtToken;

        return RedirectToLocal(returnUrl);
    }

IМне нужно было бы понять, что делает каркас идентификации / SignInManager, что отсутствует в моей логике, и как я могу добавить это в свою логику и заставить выход из системы работать правильно.Заранее спасибо.

...