Последние несколько дней я работал над созданием системы входа в систему для веб-приложения (asp.Net MVC 5), где у меня уже есть база данных с именем пользователя, учетными данными и ролями. Я нашел информацию во многих блогах и вопросы о переполнении стека для своей работы и использовал ее соответственно. Теперь, прежде чем выходить в интернет, я хочу убедиться, что эта система входа в систему безопасна. Я также хочу знать, есть ли какие-то улучшения, которые я могу реализовать для этой цели.
Для аутентификации я реализовал, как показано в статье ниже https://www.jamessturtevant.com/posts/ASPNET-Identity-Custom-Database-and-OWIN/. Для авторизации я использовал поставщика ролей и реализовал несколько обязательных методов, как показано ниже:
public class RoleList:RoleProvider
{
public override bool IsUserInRole(string username, string roleName)
{
if (username == null || username == "")
throw new ProviderException("User name cannot be empty or null.");
if (roleName == null || roleName == "")
throw new ProviderException("Role name cannot be empty or null.");
bool userIsInRole = false;
List<string> data = new List<string>();
String mycon = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
String myquery =
"SELECT " +
"r.RName, u.UName " +
"FROM " +
"Users u " +
"INNER JOIN " +
"UserRole ur " +
"ON " +
"u.Id=ur.UserId " +
"INNER JOIN " +
"Roles r " +
"ON " +
"ur.RoleId=r.Id " +
"WHERE " +
"u.UName=@UName " +
"AND " +
"r.Name=@RName";
var paramList = new List<SqlParameter>();
paramList.Add(new SqlParameter("@UName", username));
paramList.Add(new SqlParameter("@RName", roleName));
using (var reader = HelperClasses.DatabaseUtil.GetReader(myquery, mycon, paramList))
{
if (reader.HasRows)
{
userIsInRole = true;
}
}
return userIsInRole;
}
}
В базе данных В базе данных у меня есть 4 таблицы, в которых хранится информация ниже.
- пользователь (имя и идентификатор) и хэш-пароль (с использованием Bcrypt).
- Роли.
- Отображение пользователей и ролей.
- Соль сидентификатор пользователя
В контроллере входа
Логин:
- Получить соль и хэш из базы данных, используя введенное имя пользователя.
- Добавление соли к введенному простому текстовому паролю.
- Проверка пароля путем ввода хеш-кода и соленого пароля в Bcrypt.
- В случае успеха пользователь будет аутентифицирован пользовательским менеджером входа какпоказано ниже
CustomSignInManager.SignIn(user, isPersistent: false, rememberBrowser: false);
Выйти из системы:
public ActionResult LogOff()
{
HttpContext.GetOwinContext().Authentication.SignOut
(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index","Login");
}
Для авторизации действия
[Authorize(Roles = "Customer")]
public ActionResult Index()
{
return View();
}
Как, этоВажный сегмент в приложении, я хочу знать плюсы и минусы этого. Я максимально упростил вопрос, чтобы его было легче понять читателям. Это правильный путь для системы входа в систему в asp.NET MVC 5? Могу ли я сделать что-нибудь лучше?