none
Авторизация с помощью хеш-кода пользователей в ситеме RRS feed

  • Вопрос

  • Здравствуйте :)

    Необходимо реализовать авторизацию пользователя не только при вводе им пароля и логина, но и автоматически при отправке серверу хеш кода.

    После успешной авторизации пользователя, не зависимо от метода (по логину и паролю или по хеш коду) создаётся новый хеш код и отсылается пользователю на Android. Пользователь авторизовался, открылась сессия и сохраняем в ней сгенерированный хеш код. После того, как сессия закрывается (по таймауту или когда пользователь закрывает браузере) мы из сессии записываем в базу данных значение хеш, соответствующее пользователю.              

    Теперь мы можем сверять хеш код у пользователя и тот, который храниться у нас в базе данные при следующей аутентификации сравнивая их и принимая решение – пользователь должен или нет быть авторизован.

    Вот такой алгоритм, но я не понимаю как организовать принятие от пользователя и сверку хеш-кода именно в коде
    Подскажите пожалуйста

Ответы

  • Важно понять, что Membership API и FormsAutentication разные вещи. Первый предоставляет базу для хранения информации о пользователях и слой(набор классов) доступа к ним, ничего общего с аутентификацией он не имеет. Второй управляет проверкой подлииности для форм. Чтобы впустить пользователя, достаточно лишь установить cookie авторизации, методом

    FormsAuthentication.SetAuthCookie(name, false);

    и всё, пользователю разрешён доступ. Не надо даже проверять наличие этого пользователя. Если хотите создавать своего поставщика вместо Membership API, то реализуйте, создав базу и слой доступа к нему. Если хотите свою логику вместо FormsAutentication, создайте её сами, с использованием cookie, скрытых полей и Http модулей. Но мой Вам совет, из собственного опыта. Стандартная аутентификатия с использованием форм, тщательно протестирована и расширяема. Не зачем изобретать велосипед, тем более, что он до Вас уже сделан, нужно только его использовать.


    • Изменено YatajgaEditor 4 июня 2012 г. 12:03
    • Помечено в качестве ответа ansi_str 5 июня 2012 г. 9:26
    4 июня 2012 г. 12:01
    Модератор

Все ответы

  • Добрый день.

    Какой тип проверки подлинности вы используете? Если на основе форм, то покажите, что у вас уже есть...

    Отвечающий
  • Есть файл: Login.ashx

    В нём класс:
    using System;
    using System.Text;
    using System.Web;
    using System.Web.Security;
    using System.Web.SessionState;
    
    namespace AximediaSite
    {
        /// <summary>
        /// Summary description for Login
        /// </summary>
        public class Login : IHttpHandler, IRequiresSessionState
        {
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                
                string username = context.Request["login"];
                string password = context.Request["password"];
    
                if (IsUserValid(username, password))
                {
                    string hash = GenerateHash();
                    string email = String.Empty;
                    MembershipUser membershipUser = Membership.GetUser(username);
                    email = membershipUser.Email;
    
                    context.Response.Write(String.Format("OK\n{0}", email)); //username + ";" + password + " | OK");  
                 }
                else
                {
                    context.Response.Write("FAILED"); //username + ";" + password + " | FAILED");
                }
            }
            
            public string DecodeFrom64(string encodedData)
            {
                byte[] encodedDataAsBytes = Convert.FromBase64String(encodedData);
                string returnValue = ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
                return returnValue;
            }
    
    
            public bool IsUserValid(string username, string password)
            {
                if (Membership.ValidateUser(username, password)) 
                {
                    FormsAuthentication.Authenticate(username, password);
    
                    return true;
                }
                
                return false;
            }
    
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }

    C его помощью и происходит на основе форм авторизация
  • "Необходимо реализовать авторизацию пользователя не только при вводе им пароля и логина, но и автоматически при отправке серверу хеш кода. " - что за хеш код, откуда берётся и на основе чего создаётся?
    Модератор
  • Как я понимаю хеш генерирует сам сервер, что-то вроде генерации GUID видимо, и топикстартеру видимо нужно расширить класс MembershipUser полем хэш, на основе которого будет проходить дополнительная авторизация, если не задан пароль.


    Для связи [mail]

    Модератор
  • Да, именно так
    Мы (программа) просто отправляет запрос на авторизацию серверу с хеш кодом.
    И сверяем посланный хеш код с тем, что храниться в базе и на основе сравнения принимаем вывод - авторизовать или нет пользователя.

    • Изменено ansi_str 1 июня 2012 г. 6:33
  • Кажется понял, что Вы хотите. Начнём с от конца к началу:

    "Вот такой алгоритм, но я не понимаю как организовать принятие от пользователя и сверку хеш-кода именно в коде" - тут только одно единственное неполноценное решение: хранить Ваш хеш в куках и извлекать их оттуда, назначив им максимальный срок истечения. Неполноценное - пользователь может просто напросто их удалить или отключить, и ловить будет нечего.

    А, что касается вашей общей идеи, то результат, организации дополнительной защиты подобными методами, сводится к нулю. Хотите большей защиты - используйте SSL. Повысить уровень защиты немножечко, используйте максимальное количество сведений о пользователе.

    2 июня 2012 г. 14:43
    Модератор
  • А существует в ASP.NET функция, которая разрешает пользователю войти в систему, авторизуя его

    Что то наподобие:

    Autorization(username) = true;
    И мы вошли под пользователем username
    • Изменено ansi_str 3 июня 2012 г. 8:30
  • "А существует в ASP.NET функция, которая разрешает пользователю войти в систему, авторизуя его" - можно переформулировав, а то не понятно, что Вы имеете ввиду.
    Модератор
  • Пользователь хочет авторизоваться в системе
    Мы его либо пускаем, либо не пускаем

    Можно при запросе к серверу, например в Page_Load
    Сделать аутентификацию и впустить пользователя в сиcтему.

    То есть не использовать стандартный метод:

            public bool IsUserValid(string username, string password)
            {
                if (Membership.ValidateUser(username, password)) 
                {
                    FormsAuthentication.Authenticate(username, password);
    
                    return true;
                }
                
                return false;
            }



    а сделать свою авторизацию, например по хеш функции или ещё как - нибудь?


    4 июня 2012 г. 11:10
  • Важно понять, что Membership API и FormsAutentication разные вещи. Первый предоставляет базу для хранения информации о пользователях и слой(набор классов) доступа к ним, ничего общего с аутентификацией он не имеет. Второй управляет проверкой подлииности для форм. Чтобы впустить пользователя, достаточно лишь установить cookie авторизации, методом

    FormsAuthentication.SetAuthCookie(name, false);

    и всё, пользователю разрешён доступ. Не надо даже проверять наличие этого пользователя. Если хотите создавать своего поставщика вместо Membership API, то реализуйте, создав базу и слой доступа к нему. Если хотите свою логику вместо FormsAutentication, создайте её сами, с использованием cookie, скрытых полей и Http модулей. Но мой Вам совет, из собственного опыта. Стандартная аутентификатия с использованием форм, тщательно протестирована и расширяема. Не зачем изобретать велосипед, тем более, что он до Вас уже сделан, нужно только его использовать.


    • Изменено YatajgaEditor 4 июня 2012 г. 12:03
    • Помечено в качестве ответа ansi_str 5 июня 2012 г. 9:26
    4 июня 2012 г. 12:01
    Модератор