我正在使用ADO.net开发ASP MVC。我试图在用户登录后隐藏登录字段。
实际上,在从主页进行身份验证之后,用户被重定向到他的个人资料页面。问题是当用户返回主页时,他总是找到登录字段。
根据调试器,Session [" currentUser"]始终为null,然后呈现脚本。
我在开发工具中也没有发现错误。
这是我尝试过的:
@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>
更新: 控制器:
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 :(得分:2)
内置系统可帮助您登录。由于多种原因,不应使用会话变量。
要设置登录,您可以在控制器中使用以下功能:
FormsAuthentication.SetAuthCookie(UserName, remember);
同样,您可以使用FormsAuthentication.SignOut()
进行注销。
现在您的剃须刀或任何控制器中都可以检查User.Identity.IsAuthenticated
以验证用户是否已登录。
要使此功能正常运行,您还需要确保在{。{1}}下的web.config下有以下内容:
<system.web>
如果您想利用此登录功能,可以将登录表单添加到与主页不同的单独cshtml页面中。可以说此页面位于<authentication mode="Forms">
</authentication>
位置。现在您可以在web.config中修改上面的代码,如下所示
Home/Login
这会分配您的默认登录页面。现在,如果只需要在登录时访问任何URL,如果用户未登录,它将自动重定向到此位置。要指定操作需要身份验证,请在操作前使用<authentication mode="Forms">
<forms loginUrl="~/Home/Login" timeout="2880" />
</authentication>
,或者如果您使用整个控制器需要整个控制器授权。你的行动将是这样的:
[Authorize]
最后,您的示例[Authorize]
public ActionResult Index(){
return View()
}
可能如下所示:
HomeController
答案 1 :(得分:1)
在会话/缓存中存储您知道用户登录天气的令牌/相关信息,然后在编写用户登录功能的任何地方,您可以编写任何服务或只使用jquery / javascript访问,然后根据它显示或隐藏形式。