Criando sessões em ASP.NET MVC C # como PHP Session?

Sep 25 2020

Estou tendo problemas com o redirecionamento de uma página para outra em meu aplicativo ASP.NET MVC.

Atualmente, a funcionalidade de login não tem problemas. A saída esperada após o login era redirecionar para a página inicial do aplicativo.

Dentro da página inicial, existe um botão de logout para destruir a sessão criada após o login e redirecionar para a página de login.

Mas depois de destruir a sessão, e tente colocar isso na barra de endereço do navegador https://localhost:44360/home/homeque é a página inicial do aplicativo. Ele foi redirecionado mesmo que não houvesse nenhuma conta conectada. Além disso, mesmo após o logout de uma conta, se você clicar no botão Voltar do navegador, a página inicial será mostrada que não deveria ser.

No PHP, após o login, a sessão é criada e você só precisa chamar aquela Sessão para verificar se há um usuário, caso contrário, ele irá redirecioná-lo para uma Página de Erro 404 Não Encontrada Ou se você digitar apenas o link dentro a barra de endereço do navegador e não houver sessão criada, ele também irá redirecioná-lo para uma página de erro. Quero implementar esse tipo de sessão em meu aplicativo ASP.NET MVC, mas como?

Aqui está o meu código:

LoginController.cs

[HttpPost]
public ActionResult Login(LoginModel userInfo, FormCollection collection, string returnUrl)
{
    ILogicInterface<LogicalUserInput, LogicalSystemResult> iLogic = new UserLoginCheck();
    LogicalUserInput userInput = new LogicalUserInput();
    _ = new LogicalSystemResult();

    try
    {
        userInput[typeof(LoginModel).FullName] = userInfo;
        LogicalSystemResult systemResult = iLogic.DoProcess(userInput);
        bool userCheckExist = systemResult.ResultCode != LogicalSystemResult.RESULT_CODE_ERR_DATA_NOT_EXIST;

        if (userCheckExist)
        {
            UserLoginModel loginModel = systemResult[typeof(UserLoginModel).FullName] as UserLoginModel;
            Session["userInfo"] = loginModel;
            FormsAuthentication.SetAuthCookie(loginModel.email, true);

            if (!string.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                if (loginModel.AccountType == 0) 
                {
                     return RedirectToAction("Home", "Home");
                } 
                else 
                {
                     return RedirectToAction("Error", "Error");
                }                   
            }
        }
        else
        {
            TempData.Clear();
            TempData["Title"] = "Error!";
            TempData["Message"] = " Invalid Username Or Password.";
            return View();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return RedirectToAction("Error", "Error");
    }
}

HomeController.cs

// GET: Home
[Authorize]
public ActionResult Home()
{
    if (Session["userInfo"] == null) 
    {
        return RedirectToAction("Error", "Error");
    } 
    else 
    {
        UserLoginModel userLoginModel = Session["userInfo"] as UserLoginModel;
        TempData["user"] = userLoginModel.lastName + ", " + userLoginModel.firstName + " " + userLoginModel.middleName;
        string cookieValue = GlobalFunctions.StringToBase64Encode(userLoginModel.email);
        HttpCookie newCookie = new HttpCookie(GlobalFunctions.StringToBase64Encode("userInformation"), cookieValue);
        newCookie.Expires = DateTime.Now.AddHours(1);
        Response.Cookies.Add(newCookie);

        return View();              
    }         
}

[Authorize]
[HttpPost]
public ActionResult LogOut() 
{
    try 
    {
        Session.Abandon();
        FormsAuthentication.SignOut();
                    
        Session["userInfo"] = null;
        return RedirectToAction("Login", "Login");
    } 
    catch (Exception ex) 
    {
        Console.WriteLine(ex.Message);
        return View();
    }
}

É assim que chamo a LogOutfunção dentro do controlador doméstico no meu Home.cshtml.

<script>
    $("#cmdLogOff").on("click", function () { $("#HomeView").submit();
    });
</script>

@using (Ajax.BeginForm("LogOut",
         null,
         new AjaxOptions
         {
         },
    new { id = "HomeView" }))
{
   
}

Obrigado e cumprimentos,

Respostas

Noname Sep 25 2020 at 12:09

muitos frameworks em php usam SESSOIN para sessão de liberação de identidade e você verá o logout automático, mas o dotnet usa cookie em vez de sessão na identidade