Система входа с использованием провайдера идентификации и роли для существующей базы данных - PullRequest
0 голосов
/ 06 ноября 2019

Последние несколько дней я работал над созданием системы входа в систему для веб-приложения (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 таблицы, в которых хранится информация ниже.

  1. пользователь (имя и идентификатор) и хэш-пароль (с использованием Bcrypt).
  2. Роли.
  3. Отображение пользователей и ролей.
  4. Соль сидентификатор пользователя

В контроллере входа

Логин:

  1. Получить соль и хэш из базы данных, используя введенное имя пользователя.
  2. Добавление соли к введенному простому текстовому паролю.
  3. Проверка пароля путем ввода хеш-кода и соленого пароля в Bcrypt.
  4. В случае успеха пользователь будет аутентифицирован пользовательским менеджером входа какпоказано ниже
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? Могу ли я сделать что-нибудь лучше?

1 Ответ

1 голос
/ 06 ноября 2019

Это выглядит хорошо для меня.

  1. Пароль должен не храниться в базе данных в виде простого текста
  2. Все конечные точки должны быть защищены аутентификацией, за исключением пароля для входа / сброса и целевой страницы и т. Д. .
  3. Чувствительные данные, такие как пароли, не должны храниться на клиенте
  4. Должен быть тайм-аут при входе в систему
  5. Использовать, по возможности, современную среду

Если вы беспокоитесь о безопасности, вам также необходимо рассмотреть основные методы защиты веб-сайтов. Например, убедитесь, что любые данные, поступающие из поля ввода пользователя, очищаются перед их вставкой в ​​базу данных. Некоторые веб-сайты предоставляют бесплатные отчеты о безопасности, например securityheaders.com .

...