В настоящее время я работаю над системой входа в систему моего WebApp, которую я разрабатываю в ASP.NET MVC. В настоящее время я использую .NET Framework 4.8.x. Теперь я разработал пользовательский интерфейс, и мой сервер работает. Это позволяет пользователю входить и выходить без проблем. Но теперь мой вопрос: безопасен ли мой способ работы?
Вот так выглядит моя функция входа в систему:
Примечание: В настоящее время я сохраняю пароль в целях тестирования, но позже я изменю его какхэш один с добавлением соли.
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 часа? К сожалению, я не знаю, как это сделать. Я знаю, как работает автоматический выход из системы через тайм-аут сеанса. Но я думаю, что SessionIDManager
очень мне поможет. Тем не менее, я не использую сущностную инфраструктуру и поэтому не могу дать классу SessionIDManager
экземпляр контекста.
Для авторизации пользователя я использую фильтр. Это выглядит так:
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);
}
}
У кого-нибудь есть предложения по улучшению для меня?
Безопасно ли использовать переменную сеанса для авторизации?