簡體   English   中英

Aspnet.core 程序登錄但考慮同一個表中的數據

[英]The Aspnet.core program logs in but considers the data in the same table

我的代碼有問題,程序登錄和退出我為每種類型的用戶提供三個控制器,當我登錄時,程序登錄但演示文稿好像它們都來自 Socio 表。 我已經檢查了表格並且沒有相同的數據,我檢查了每種類型用戶的視圖布局,一切都很好。 有人可以幫我解決這個問題嗎?

登錄方法在控制器主頁中,這是代碼:

 public IActionResult Login(string user, string password, string? ReturnUrl)
        {
            SHA512 sha512 = SHA512Managed.Create();
            byte[] bytes = sha512.ComputeHash(Encoding.UTF8.GetBytes(password), 0, Encoding.UTF8.GetByteCount(password));


            string passHash = Convert.ToBase64String(bytes);

            Socios socio = _context.Socios.Include(s => s.Gerir).Include(s => s.Mensagem).Include(s => s.Participa).Include(s => s.PersonalTrainer).Include(s => s.Peso).Include(s => s.PlanosExercicios).FirstOrDefault(s => s.NomeUtilizador == user && s.Password == password);
            if (socio != null)
            {
                HttpContext.Session.SetString("Nome", socio.NomeUtilizador);
                HttpContext.Session.SetInt32("UserId", socio.Idsocio);

                HttpContext.Session.SetString("Perfil", "Socio");

            }
            Professores prof = _context.Professores.Include(p => p.MapaAulasGrupo).Include(p => p.Mensagem).Include(p => p.Peso).Include(s => s.PersonalTrainer).Include(p => p.PlanosExercicios).FirstOrDefault(p => p.Nome == user && p.Password == password);
            if (prof != null)
            {
                HttpContext.Session.SetString("Nome", prof.Nome);
                HttpContext.Session.SetInt32("UserId", prof.Idprofessor);


                HttpContext.Session.SetString("Perfil", "Professor");

            }
            Administrador admin = _context.Administrador.Include(a => a.Gerir).SingleOrDefault(a => a.Nome == user && a.Password == password);
            if (admin != null)
            {
                HttpContext.Session.SetString("Nome", admin.Nome);
                HttpContext.Session.SetInt32("UserId", admin.Idadministrador);


                HttpContext.Session.SetString("Perfil", "Administrador");

            }

            if (String.IsNullOrEmpty(ReturnUrl))
            {
                //ModelState.AddModelError("","Utilizador inexistente na base de dados!");
                //TempData["mensagemErro"] = "Utilizador inexistente na base de dados!";
                //return View("NaoEncontrado","Socios");
                return LocalRedirect("/");
            }
            else
            {
                return LocalRedirect(ReturnUrl);
            }
        }

在布局中我必須區分登錄的類型,呈現與每個控制器對應的視圖

<header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-dark bg-dark border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index"> </a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <ul class="navbar-nav">
                        @if (SociosController.estaAutenticado(Context))
                        {

                            <li class="nav-item">
                                <a class="nav-link text-white" asp-controller="Socios" asp-action="PerfilSocio">Meu perfil</a>

                            </li>
                            <li class="nav-item">
                                <a class="nav-link text-white" asp-controller="Socios" asp-action="ListarProfessores">Professores</a>

                            </li>

                            <li class="nav-item">
                                <p class="nav-link text-white">Bem-vindo, @Context.Session.GetString("Nome")</p>
                            </li>

                            <li class="nav-item">
                                <form class="form-inline" asp-controller="Home" asp-action="Logout">
                                    <button type="submit" class="nav-link btn btn-link text-white">Sair</button>
                                </form>
                            </li>
                        }

                        else if (ProfessoresController.estaAutenticado(Context))
                        {
                            <li class="nav-item">
                                <a class="nav-link text-white" asp-controller="Professores" asp-action="Perfil">Meu perfil</a>

                            </li>


                            <li class="nav-item">
                                <p class="nav-link text-white">Bem-vindo, @Context.Session.GetString("Nome")</p>
                            </li>
                            <li class="nav-item">
                                <form class="form-inline" asp-controller="Home" asp-action="Logout">
                                    <button type="submit" class="nav-link btn btn-link text-white">Sair</button>
                                </form>
                            </li>
                        }

                        else if (AdministradoresController.estaAutenticado(Context))
                        {

                            <li class="nav-item">
                                <a class="nav-link text-white" asp-controller="Administradores" asp-action="Perfil">Meu perfil</a>

                            </li>

                            <li class="nav-item">
                                <p class="nav-link text-white">Bem-vindo, @Context.Session.GetString("Nome")</p>
                            </li>

                            <li class="nav-item">
                                <form class="form-inline" asp-controller="Home" asp-action="Logout">
                                    <button type="submit" class="nav-link btn btn-link text-white">Sair</button>
                                </form>
                            </li>

                        }
                        else
                        {
                            <li class="nav-item">
                                <a class="nav-link text-white" asp-controller="Home" asp-action="Login">Entrar </a>
                            </li>
                            <li class="nav-item">
                                <a class="nav-link text-white" asp-area="" asp-controller="Home" asp-action="Registo">Registar</a>
                            </li>
                        }
                    </ul>

                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-white" asp-area="" asp-controller="Home" asp-action="Index">Pagina Inicial</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-white" asp-area="" asp-controller="Home" asp-action="Info">Sobre nós</a>
                        </li>


                        <li class="nav-item">
                            <a class="nav-link text-white" asp-area="" asp-controller="Home" asp-action="AulasDeGrupo">Aulas de Grupo</a>
                        </li>




                    </ul>
                </div>
            </div>
        </nav>
    </header>

在布局“estaAutenticado”中調用的函數可以在每種類型的用戶的控制器中找到,這是代碼:

public static bool estaAutenticado(HttpContext contexto)
        {
            if (contexto.Session.GetInt32("UserId") != null)
                return true;
            else
                return false;
        }

有人可以幫我解決這個問題嗎? 我不明白為什么他將我登錄的所有用戶都視為合作伙伴,即使他們來自教師或管理員表。

問題是您為每種類型的用戶設置了相同的 Session-key UserId ,您應該進行如下修改:

登錄方式

Socios socio = _context.Socios.Include(s => s.Gerir).Include(s => s.Mensagem).Include(s => s.Participa).Include(s => s.PersonalTrainer).Include(s => s.Peso).Include(s => s.PlanosExercicios).FirstOrDefault(s => s.NomeUtilizador == user && s.Password == password);
        if (socio != null)
        {
            HttpContext.Session.SetString("Nome", socio.NomeUtilizador);
            HttpContext.Session.SetInt32("UserId", socio.Idsocio);

            HttpContext.Session.SetString("Perfil", "Socio");

        }
        Professores prof = _context.Professores.Include(p => p.MapaAulasGrupo).Include(p => p.Mensagem).Include(p => p.Peso).Include(s => s.PersonalTrainer).Include(p => p.PlanosExercicios).FirstOrDefault(p => p.Nome == user && p.Password == password);
        if (prof != null)
        {
            HttpContext.Session.SetString("Nome", prof.Nome);
            //set ProfessorId for Professores 
            HttpContext.Session.SetInt32("ProfessorId", prof.Idprofessor);
            HttpContext.Session.SetString("Perfil", "Professor");

        }
        Administrador admin = _context.Administrador.Include(a => a.Gerir).SingleOrDefault(a => a.Nome == user && a.Password == password);
        if (admin != null)
        {
            HttpContext.Session.SetString("Nome", admin.Nome);

            //set AdminId for Administrador 
            HttpContext.Session.SetInt32("AdminId", admin.Idadministrador);
            HttpContext.Session.SetString("Perfil", "Administrador");

        }

每種類型控制器中的 estaAutenticado 方法

//SociosController
public static bool estaAutenticado(HttpContext context)
{
        if (context.Session.GetInt32("UserId") != null)
            return true;
        else
            return false;
}

//ProfessoresController
public static bool estaAutenticado(HttpContext context)
{
        if (context.Session.GetInt32("ProfessorId") != null)
            return true;
        else
            return false;
}

//AdministradoresController
public static bool estaAutenticado(HttpContext context)
{
        if (context.Session.GetInt32("AdminId") != null)
            return true;
        else
            return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM