none
Теоретический вопрос по авторизации клиентского приложения на сервере RRS feed

  • Вопрос

  • Возникла такая задача.

    Есть больше чем 100 клиентских машин с приложением. Естественно клиентские приложения могут принадлежать различным владельцам и делиться на разные категории. Как автоматизировать  идентификацию клиентов на сервере без ручного ввода пароля и логина? На основе чего олицетворять клиента?

    Задача стоит такая, чтобы сразу после установки приложения и обращению к серверу, было ясно где установлен клиент, кому он принадлежит и т.п.

     Windows авторизация навряд ли подойдет, так как клиенты будут работать в разных сетях. На основе форм тоже, так как требуется хотя бы первоначальный ввод учетных данных.

Ответы

  • То есть вы хотите что бы сервер заранее знал обо всех клиентах?

    Мой вариант был в том, что бы сервер получив запрос на авторизацию смотрел отмечен ли у него такой ID и если нет добавлял нового пользователя. Но вам кажется это не подходит.

    Если вы хотите что бы сервер знал о том какой это клиент, но клиент для этого ни чего не делал (вы просто дали ему дистрибутив и он его установил), то вам нужно формировать установочные пакеты отдельно для каждого пользователя. Во время установки будет создан некий файл с информацией о текущем клиенте, а программа используя данные из этого файла автаризируется на сервере, на котором уже заполнены данные о таком пользователе.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа V.A.Zolotov 6 мая 2012 г. 8:19
    Отвечающий
  • В случае с Win8 можно использовать LiveID пользователя который он указывает пользуясь сервисами Win8, но тогда сервер за ранее не сможет знать что то нужное о пользователе.

    Как я понимаю - есть сервер компании и есть N-е число работников компании. На сервере мы наполняем базу сотрудников и раздаем им клиентское приложение, но в случае с windows store эта схема не работает так как программу сможет установить любой (кто ее купит если она платная) и сервер за ранее не может знать всех кто установит программу.

    Вам нужен компромисс - либо создавать систему с известной базой клиентов либо все же просить клиента рассказать о себе, что бы вы могли его идентифицировать.

    Пример - вы компания продающая некие товары. Вы хотите что бы у ваших клиентов была программа с быстрым доступом к свежему прайсу, накопительной системой скидок, историей заказов и т.д. В момент когда человек становится ваши клиентом вы как то его идентифицируете, например записываете как ООО "Покупатель", затем у вас 2 варианта (универсальный и не очень). Не очень универсальный мы с вами уже рассмотрели выше, а вот универсальный таков - как только ООО "Покупатель" становится вашим клиентом вы заносите его данные в базу сервера и генерируете уникальные для него логин и пароль, а затем передаете клиенту. Он ставит приложение (не важно как, через магазин или ручками), один раз вводит логин и пароль и дальше пользуется программой с удовольствием. Да это противоречит вашему первоначальному вопросу, но как я уже и сказал придется идти на компромисс.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа V.A.Zolotov 6 мая 2012 г. 8:59
    Отвечающий

Все ответы

  • Если я вас правильно понял, то вам нужен уникальный ID клиента постоянный для каждой клиентской машины. Самое простое это брать UID из раздела реестра HKEY_CURRENT_USER\Identities\Default User ID. Главное преимущество UID  в его уникальности. Не существует двух ОС с одинаковым UID

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Спасибо за ответ. Но что делать если сервер не знает чей это UID, а клиентское приложение должно идентифицироваться на сервере сразу после установки? 

  • То есть вы хотите что бы сервер заранее знал обо всех клиентах?

    Мой вариант был в том, что бы сервер получив запрос на авторизацию смотрел отмечен ли у него такой ID и если нет добавлял нового пользователя. Но вам кажется это не подходит.

    Если вы хотите что бы сервер знал о том какой это клиент, но клиент для этого ни чего не делал (вы просто дали ему дистрибутив и он его установил), то вам нужно формировать установочные пакеты отдельно для каждого пользователя. Во время установки будет создан некий файл с информацией о текущем клиенте, а программа используя данные из этого файла автаризируется на сервере, на котором уже заполнены данные о таком пользователе.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа V.A.Zolotov 6 мая 2012 г. 8:19
    Отвечающий
  • Если вы хотите что бы сервер знал о том какой это клиент, но клиент для этого ни чего не делал (вы просто дали ему дистрибутив и он его установил), то вам нужно формировать установочные пакеты отдельно для каждого пользователя. Во время установки будет создан некий файл с информацией о текущем клиенте, а программа используя данные из этого файла автаризируется на сервере, на котором уже заполнены данные о таком пользователе.

    А как автоматизировать сборку установочного пакета? Динамическая компиляция на сервере не есть гуд
  • Пусть сервер создает только идентификационный файл пользователя, который вы будете добавлять в установочный пакет и отдавать клиенту.

    Клиентская программа при таком раскладе будет иметь единый код для всех клиентов, а отличия будут зашиты в ID файл сгененрированнй для конкретного клиента сервером.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Пусть сервер создает только идентификационный файл пользователя, который в будете добавлять в установочный пакет и отдавать клиенту.

    Клиентская программа при таком раскладе будет иметь единый код для всех клиентов, а отличия будут зашиты в ID фал сгененрированнй для конкретного клиента пользователем.

     

    А что если приложение будет распространятся через windows store? Для Win7 предложенный вариант подходит, а для Win8 да при распространении приложения через магазин (при распространении с нашего сервера тоже подойдет) не уверен в работоспособности предложенного варианта
  • хотя при распространении через магазин даже проще на проще. При условии что Live Id на всех машинах одинаковый
  • В случае с Win8 можно использовать LiveID пользователя который он указывает пользуясь сервисами Win8, но тогда сервер за ранее не сможет знать что то нужное о пользователе.

    Как я понимаю - есть сервер компании и есть N-е число работников компании. На сервере мы наполняем базу сотрудников и раздаем им клиентское приложение, но в случае с windows store эта схема не работает так как программу сможет установить любой (кто ее купит если она платная) и сервер за ранее не может знать всех кто установит программу.

    Вам нужен компромисс - либо создавать систему с известной базой клиентов либо все же просить клиента рассказать о себе, что бы вы могли его идентифицировать.

    Пример - вы компания продающая некие товары. Вы хотите что бы у ваших клиентов была программа с быстрым доступом к свежему прайсу, накопительной системой скидок, историей заказов и т.д. В момент когда человек становится ваши клиентом вы как то его идентифицируете, например записываете как ООО "Покупатель", затем у вас 2 варианта (универсальный и не очень). Не очень универсальный мы с вами уже рассмотрели выше, а вот универсальный таков - как только ООО "Покупатель" становится вашим клиентом вы заносите его данные в базу сервера и генерируете уникальные для него логин и пароль, а затем передаете клиенту. Он ставит приложение (не важно как, через магазин или ручками), один раз вводит логин и пароль и дальше пользуется программой с удовольствием. Да это противоречит вашему первоначальному вопросу, но как я уже и сказал придется идти на компромисс.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа V.A.Zolotov 6 мая 2012 г. 8:59
    Отвечающий
  • Задача стоит такая, чтобы сразу после установки приложения и обращению к серверу, было ясно где установлен клиент, кому он принадлежит и т.п.


    1) А по IP как то можно определить его местонахождение? Установил программу - она проверила его внешний (интернетовский) IP пусть даже динамический. И по нему уже при первом запуске определила его местонахождение. 

    2) Я в будущем собираюсь сделать так: регистрация на сайте - при регистрации уникальному email присвоить уникальный ID. Не два имя и пароль, а один. Потом первый запуск программы - виден текстбокс - туда ввели этот ID и TextBox стал недоступен. А программа отсылает этот ID на сервер для проверки. Сервер проверил - подключение есть или нет. Один ID - одно подключение. Если кто то свой ID сольёт в сеть - значит рискует, что с его ID кто то подключится и ему самому доступа не будет уже.

    3 июля 2012 г. 16:11
  • 1) А по IP как то можно определить его местонахождение? Установил программу - она проверила его внешний (интернетовский) IP пусть даже динамический. И по нему уже при первом запуске определила его местонахождение. 

    2) Я в будущем собираюсь сделать так: регистрация на сайте - при регистрации уникальному email присвоить уникальный ID. Не два имя и пароль, а один. Потом первый запуск программы - виден текстбокс - туда ввели этот ID и TextBox стал недоступен. А программа отсылает этот ID на сервер для проверки. Сервер проверил - подключение есть или нет. Один ID - одно подключение. Если кто то свой ID сольёт в сеть - значит рискует, что с его ID кто то подключится и ему самому доступа не будет уже.

    Все что касается первого вопроса не реализовать внутренними возможностями .Net. Вам придется делать запросы к неким сервисам whois, что бы узнать местоположения IP. да и вообще что бы узнать внешний IP так же придется обращаться к внешнему сервису. Таким образом ваше приложение становится зависимым от работы других сервисов, работу которых вы гарантировать не можете.

    По второму вопросу. ID может быть все что угодно и, не обязательно, что это число, поэтому в вашем случае в качестве ID можно использовать email и не придется генерировать чего то дополнительного. НО, пароль нужен то же, так как любой ID могут просто попытаться угадать, а вот пару полей угадать в пару миллионов раз сложнее. То есть при регистрации сохраняете пару "Email" и "Пароль" и это пара используется для входа, а для идентификации пользователя во всех остальных функциях программы используйте только Email как ID.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    3 июля 2012 г. 18:03
    Отвечающий
  • Хорошо. Наверное да - соглашусь так правильнее.
    3 июля 2012 г. 19:07