C# ASP.NET MVC中的安全登录方法
我目前正在开发我的WebApp的登录系统,我正在ASP.NET MVC中开发。我目前正在使用.NETFramework 4.8.x。现在我已经开发了UI,我的后端正在运行。这允许用户无任何问题地登录和注销。但我现在的问题是我的工作方式是否安全 这就是我的登录功能的外观:C# ASP.NET MVC中的安全登录方法,c#,asp.net-mvc,authentication,C#,Asp.net Mvc,Authentication,我目前正在开发我的WebApp的登录系统,我正在ASP.NET MVC中开发。我目前正在使用.NETFramework 4.8.x。现在我已经开发了UI,我的后端正在运行。这允许用户无任何问题地登录和注销。但我现在的问题是我的工作方式是否安全 这就是我的登录功能的外观: if (Session["username"] != null) { Session.Clear(); Sessio
if (Session["username"] != null)
{
Session.Clear();
Session.RemoveAll();
Session.Abandon();
}
return View();
注意:目前,我正在保存密码,因为它是为了测试目的,但稍后我会将其更改为添加了盐的哈希密码
String mycon = "my-connection-string";
SqlConnection scon = new SqlConnection(mycon);
String myquery = "select * from loginDetails where uName=@uName and paswrd=@paswrd";
scon.Open();
SqlCommand cmd = new SqlCommand(myquery, scon);
cmd.Parameters.AddWithValue("@uName", lc.userName);
cmd.Parameters.AddWithValue("@paswrd", lc.password);
SqlDataReader sdr = cmd.ExecuteReader();
if (sdr.Read())
{
Session["username"] = lc.userName.ToString();
return RedirectToAction("Index", "Home");
}
else
{
ViewData["Message"]= "Invalid Username or Password";
}
scon.Close();
return View(lc);
这是我的注销功能的外观:
if (Session["username"] != null)
{
Session.Clear();
Session.RemoveAll();
Session.Abandon();
}
return View();
我这里有什么错误吗?如果服务器只检查用户名,对我来说似乎不太安全。如果我使用SessionID,并且它在24小时后过期,不是更安全吗?不幸的是,我不知道怎么做。我知道通过会话超时自动注销是如何工作的。但是我认为会议经理会帮我很多。但是,我不使用实体框架,因此我不能给sessiondmanager类一个上下文实例
要授权用户,我使用过滤器。看起来是这样的:
public class Authorize : System.Web.Mvc.ActionFilterAttribute, System.Web.Mvc.IActionFilter
{
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
if (HttpContext.Current.Session["username"] == null)
{
filterContext.Result = new System.Web.Mvc.RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary
{
{ "Controller", "Login"},
{ "Action", "Index"},
});
}
base.OnActionExecuting(filterContext);
}
}
有人对我有改进建议吗
使用session变量进行授权是否安全?您可以使用login with model secure方法
public ActionResult Login(string username, string password)
{
// LoginDetails -> Your Model Name && db -> Your Database Context Name
LoginDetails loginDetails = db.LoginDetails.Where(item => item.username == username && item.password == password).FirstOrDefault();
if(loginDetails == null)
// Login Failed
else
// Login Successful
}
值得一看的是microsoft提供的名为identity的解决方案,它将使您的系统在会话/登录/安全性方面的各个方面变得更容易。链接:这是不安全的-密码以明文形式存储在数据库中。这是一个严重的安全违规行为,永远不应该这样做。密码应该是单向散列和盐析的-这意味着任何获得数据库访问权限的人都不会突然拥有所有人的密码。这是model方法。发送model并打开new model Not with query!。你不能说没有用的抱歉,但这是不可接受的。当然,你不应该将密码保存为纯文本。但我认为提问者也很清楚这一点。对于这个问题,更重要的是,仅将用户名存储在会话变量中是否安全,以便后续查询web服务器。或者我应该生成SessionID吗?如果是的话,那怎么办?更确切地说:如果我成功登录,我该怎么办?@Ali你为什么认为提问者很清楚这一点?他们没有提到他们意识到这一点。@HasanKaanTURAN我可以说,如果你告诉人们它是安全的,而实际上它不是,那是没有用的。如果你不想被否决,那就修改你的例子,使它安全。