2017-11-14 1 views
0

나는 ADO.net을 사용하여 ASP MVC를 개발 중입니다. 사용자 로그인 후 로그인 필드를 숨기려고합니다.숨겨진 방법 로그인 한 사용자로부터 로그인 필드

실제로 홈 페이지의 인증 후에 사용자는 프로필 페이지로 리디렉션됩니다. 문제는 사용자가 홈 페이지로 돌아갈 때 항상 로그인 필드를 찾는다는 것입니다.

디버거에 따르면 세션 [ "currentUser"]은 항상 null로 유지되고 스크립트가 렌더링됩니다.

dev 도구에서도 오류를 찾지 못했습니다.

@if (Session["currentUser"] != null) 
{ 
    <script type='text/javascript'> 
$(document).ready(function(){ 
    $("#login").hide(); 
}); 
    </script> 
} 
     <div class="login" id="login"> 
      @*@RenderPage("~/Views/Home/Login.cshtml")*@ 
      <link href="~/Content/toastr.css" rel="stylesheet" /> 
      <div class="main-w3l"> 
       <div class="w3layouts-main" style="background-image:url('/template/web/images/bg3.jpg'); margin-top:50px;"> 
        <h2>Login Now</h2> 


        @using (Html.BeginForm("Login", "Home", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
        { 


         @Html.AntiForgeryToken() 
         @Html.ValidationSummary(true) 

         <input value="E-MAIL" name="Email" type="email" required="" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'E-Mail';}" /> 
         <input value="PASSWORD" name="Password" type="password" required="" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'password';}" /> 
         <span><input type="checkbox" />Remember Me</span> 
         <h6><a href="#">Forgot Password?</a></h6> 
         <div class="clear"></div> 
         <input type="submit" value="login" name="login"> 

        } 

        <p>Don't Have an Account ?<a href="#" onclick="@("window.location.href='" + @Url.Action("Create", "Client") + "'") ;">Register Now</a></p> 
       </div> 
      </div> 

UPDATE : 컨트롤러 :

public ActionResult Login() 
     { 
      return View(); 
     } 

    database_Access_layer.db dblayer = new database_Access_layer.db(); 


    [HttpPost] 
    public ActionResult Login(FormCollection fc, string LastName, string Email) 
    { 

     int res = dblayer.Admin_Login(fc["Email"], fc["Password"]); 
     if (res == 1) 
     { 
      Session["currentUser"] = Email; 
      string z = Email; 
      connection(); 
      con.Open(); 
      SqlCommand command = new SqlCommand("select Email from Client", con); 

      List<string> result = new List<string>(); 
      using (var reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
        result.Add(reader.GetString(0)); 
       con.Close(); 
      } 
      foreach (string x in result) 
      { 
       if (x == z) 
       { 

        SqlCommand command2 = new SqlCommand($"select LastName from Client WHERE Email= '{x}' ", con); 
        con.Open(); 
        string y = command2.ExecuteScalar().ToString(); 
        con.Close(); 
        Session["currentUser"] = y; 

       } 
      } 

      return RedirectToAction("Profil", "Client"); 
      Session.RemoveAll(); 


     } 
     else { 

      TempData["msg"] = " Email or Password is wrong !"; 
      return RedirectToAction("Index", "Home"); 

     } 

    } 
+0

당신의 작업은 다음과 같이 보일 것인가? .net 코어 또는 .net 프레임 워크? –

+1

mvc 5, .net 코어 – Exact

+0

잘 mvc 5는 .net 코어가 아닙니다. .net 코어에는 mvc 6이 있고 mvc 5는 들어 있습니다.net framework –

답변

1

스토어는 사용자 날씨 알고있는 토큰/관련 정보가 로그인 또는

내가 무엇을 시도했다입니다 세션/캐시가 아닌 사용자 로그인 기능을 작성한 곳이라면 서비스를 작성하거나 jquery/javascript를 사용하여 액세스 한 다음 그에 따라 양식을 표시하거나 숨길 수 있습니다.

+0

더 자세히 설명해 주시겠습니까? – Exact

2

로그인에 도움이되는 시스템이 내장되어 있습니다. 세션 변수는 여러 가지 이유로 사용되어서는 안됩니다.

가 로그인을 설정하려면 컨트롤러 내에서 다음과 같은 기능을 사용할 수 있습니다 :
FormsAuthentication.SetAuthCookie(UserName, remember); 

가 마찬가지로 사용자가 로그 아웃에 대한 FormsAuthentication.SignOut()를 사용할 수 있습니다. 이제 면도칼 내 또는 컨트롤러에 사용자가 로그인하면 User.Identity.IsAuthenticated을 확인하는 확인할 수 있습니다.

작동하는이 기능을 위해

, 당신은 또한 당신이 웹에서 다음했는지 확인해야합니다. 설정, 당신의 <system.web>에서 :이 로그인 기능을 이용하고 싶은 경우

<authentication mode="Forms"> 

</authentication> 

더욱 더, 당신은 당신의 홈 페이지와 다른 별도의 cshtml 페이지에 로그인 양식을 추가 할 수 있습니다. 이 페이지가 Home/Login에 있다고합시다. 이제 web.config에서 위 코드를 다음과 같이 수정할 수 있습니다.

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

기본 로그인 페이지가 할당됩니다. 이제 로그인 할 때 URL 만 액세스해야하는 경우 사용자가 로그인하지 않은 경우 자동으로이 위치로 리디렉션됩니다. 액션에 인증이 필요하다는 것을 지정하려면 전체 컨트롤러가 필요하면 작업 전에 전체 주소로 [Authorize]을 사용하십시오. 인정 받은.

[Authorize] 
public ActionResult Index(){ 
    return View() 
} 

마지막으로 샘플 HomeController이 같은 것을 볼 수 있습니다 : :이 .NET 버전

public class HomeController : Controller 
{ 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpGet] 
    public ActionResult Login() 
    { 
     return View(); // for the login form 
    } 

    [HttpPost] 
    public void Login(string UserName, .... <other fields>) 
    { 
     // validate your login first here 
     FormsAuthentication.SetAuthCookie(UserName, true); 
    } 

} 
+0

당신이 제안한 것을 시도했지만 EF를 사용하지 않고 계정 컨트롤러가 없다는 것을 언급하고 싶습니다. 로그인 액션은 HomeController에 있습니다. 그러나 당신이 제안한 것을 시도했는데 또 다른 것은 두 개의 웹 설정이 있습니다. 내가 수정해야하는 프로젝트 – Exact

+1

이것은 사용 EF를 사용하지 않습니다. 계정 컨트롤러는 예제 일뿐입니다. HomeController 내에서 모든 것을 할 수 있습니다. 하지만 가지고있는 로그인 액션은 로그인 정보를 제출하는 것입니다. 어디서나 다른 행동을 취할 필요가 있습니다. 로그인 HTML 양식에 대한보기를 리턴합니다. 보기 폴더 안의 폴더가 아닌 기본 폴더의 web.config를 수정해야합니다. –

+0

다른보기를 반환하는 로그인 작업이 있습니다. 코드 내 업데이트를 참조하십시오. – Exact

관련 문제