Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Аутентификация шаг за шагом / 25 сообщений из 52, страница 1 из 3
12.04.2014, 15:18
    #38613142
Мембершип
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Подскажите, как правильно организовать аутентификацию на формах?

Без использования Вижуал Студио.

Какие шаги нужно сделать? И в коде.
...
Рейтинг: 0 / 0
12.04.2014, 15:30
    #38613147
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
...
Рейтинг: 0 / 0
12.04.2014, 15:31
    #38613148
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Поторопился, в вопросе не было про MVC )
...
Рейтинг: 0 / 0
12.04.2014, 17:30
    #38613203
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Мембершип,

в топку формы и мембершип!
...
Рейтинг: 0 / 0
12.04.2014, 19:24
    #38613243
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
hVostt,

Просвети, поиз, по новым трендам, мне сейчас как раз авторизацию делать, а во всех моих учебниках - мембершип.
...
Рейтинг: 0 / 0
13.04.2014, 15:08
    #38613552
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.ProПросвети, поиз, по новым трендам, мне сейчас как раз авторизацию делать, а во всех моих учебниках - мембершип.

ASP.NET Identity Overview

примеры кода можно получить так:

1. Создать проект MVC 5
2. Обновить все пакеты Update-Package
3. Перезапустить проект (закрыть студию и открыть заново)
4. Установить пакет Microsoft.AspNet.Identity.Samples вот так:
Код: c#
1.
    Install-Package Microsoft.AspNet.Identity.Samples -Version 2.0.0-beta2 –Pre



изучайте.

самое примечательное, что Microsoft AspNet Identity не зависит от IIS и от тонны ASP.NET кода, отлично взаимодействует с OWIN и WebAPI. напрямую работает с EF (да вообще с чем угодно), в отличие от устаревших техник, которые работают с базой данных только напрямую.

и не слушайте тех, кто говорит что SimpleMembership вещь годная. вовсе нет, это уродец. всё дело в банальной привычке и нежелании что-то там изучать.
...
Рейтинг: 0 / 0
13.04.2014, 15:23
    #38613566
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
благодарю - поизучаю
как понимаю, в MVC 4 это не работает, надо проапгрейдить проект
...
Рейтинг: 0 / 0
13.04.2014, 16:50
    #38613616
Мембершип
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
А для старичков , сидящих на вебформах 2.0 есть какой-нибудь годный туториал?

Просто все что я находил в сети ориентировано на создание инфраструктуры мембершипа из студии, а как без этого тула быть, как руками?
...
Рейтинг: 0 / 0
03.07.2014, 19:00
    #38687189
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
hVostt,

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

У меня пользователи сами не регистрируются, их создает админ. Система наборов прав и совокупностей прав как ролей - тоже своя, хранение и управление пользователями - тоже, проверку логина/пароля я могу обеспечить своей реализацией.

То есть, по большому счету мне нужно от системы аутентификации очень немного, то есть:
1) Обеспечение входа-выхода пользователя с точки зрения его браузера/текущей сессии (как в пределах сессии, так и с функцией "запомнить меня" между сессиями)
2) Знание в контексте контроллера текущего пользователя (либо ID, либо экземпляра моего класса пользователя)

Я буду очень признателен тебе, если ты дашь примерный список классов и методов, достаточных для решения только указанных задач. Это сэкономит мне массу времени.
...
Рейтинг: 0 / 0
04.07.2014, 01:34
    #38687393
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.ProВот только сейчас добрался, поставил пример и офигел, увидев этот многоэтажный огород.

лишнее просто надо выкинуть и всё.

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

http://www.asp.net/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms-project

если роли не нужны, просто не пользуйся ими, не нужны функции регистрации, смены пароля и т.д. и т.п., тоже самое, просто не используй их. в целом ASP.NET Identity Не зависит от базы данных и EF, т.е. можно не использовать EF, но тогда придётся реализовать интерфейсы IUserStore и другие, которые требуются по задаче. лучше разобраться самостоятельно, глубоко вникать не надо, основное в туториале, остальное можно по ходу дела раздуплить.

желательно использовать именно ASP.NET Identity, так как на сегодняшний день это активно продвигаемый и развиваемый подход. да, возможно завтра они придумают что-то другое, но это уже философия, которую даже не интересно слушать.

можно использовать SimpleMembershipProvider, но он по умолчанию хочет запихать свои данные в базу данных самостоятельно, что чаще всего не айс.

можно использовать старую модель провайдеров мембершипа, по этому делу материала в сети более чем достаточно.

можно ничего из предложенного не исопльзовать, и реализовать полностью свой механизм со своим блекджеком и ко.

в общем рекомендую ASP.NET Identity, который на мой взгляд менее избыточен и независим, чем другие, и в целом удачен. если используется EF, то для EF есть готовые адаптеры, ничего писать практически не надо, только скопировать и подкорректировать код инициализации. куда уж проще то.
...
Рейтинг: 0 / 0
04.07.2014, 01:38
    #38687394
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.Pro,

ещё вот тут добрый дядька МСУ, да вон тот, который машет своей пятернёй из бани, накидал кучу полезного материала по теме:

http://codearticles.ru/catalogs/501
...
Рейтинг: 0 / 0
04.07.2014, 10:23
    #38687566
Парамон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.Proпримерный список классов и методов, достаточных для решения только указанных задач
Код: c#
1.
 FormsAuthentication.SetAuthCookie(userName, false);
...
Рейтинг: 0 / 0
04.07.2014, 11:47
    #38687728
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Если не использовать EF, а также для понимания внутренней кухни Identity рекомендую тынц
...
Рейтинг: 0 / 0
06.07.2014, 16:41
    #38688874
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Последовательность шагов, которая у меня получилась, чтобы прикрутить к проекту MVC4 аутентификацию (не авторизацию) Identity в минимальном варианте (заодно в своей голове все уложу):

1) Проапгрейдиться до MVC5/WebAPI2 (полезная информация тут , тут )

2) Установить пакеты:
Identity Core
Identity Owin
Owin Host SystemWeb

3) Реализовать интерфейс Microsoft.AspNet.Identity.IUser (для примера пусть будет MYUser)
Собственно - там минимальный набор полей - Id и Name, то бишь смело можно прикручивать к любому своему классу пользователя

4) Реализовать интерфейс Microsoft.AspNet.Identity.IUserStore<MYUser> (для примера пусть будет MYUserStore).
Это класс для организации работы с хранилищем пользователей, интерфейс представляет собой простой CRUD-набор методов.

5) Создать startup-класс. Различные варианты его размещения и обнаружения описаны тут . Ориентировочное содержимое:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
using Owin;
using Microsoft.Owin;
using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security.Cookies;


namespace ......
{
  public partial class Startup
  {
    public void Configuration(IAppBuilder app)
    {
      app.UseCookieAuthentication(new CookieAuthenticationOptions
      {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Login")
      });
      app.CreatePerOwinContext(() => new UserManager<MYUser>(new MYUserStore()));

    }
  }
}



6) выпилить из web.config winforms-аутентификацию

7) При логине пользователя используется (очень упрощенно) следующая схема
Код: c#
1.
2.
3.
4.
5.
6.
7.
      var man = HttpContext.GetOwinContext().GetUserManager<UserManager<MYUser>>();
      var userIdentity = man.CreateIdentity(
        man.FindAsync("User", "Pass").Result;
        DefaultAuthenticationTypes.ApplicationCookie
        );
      var am = HttpContext.GetOwinContext().Authentication;
      am.SignIn(new AuthenticationProperties() { IsPersistent = true }, userIdentity);

Вторая строка создает ClaimIdentity-объект, содержащий ID и Name пользователя, указанного в первом параметре CreateIdentity. Этого пользователя можно получить через UserManager.FindAsync (который вызовет соответствующие метод хранилища MYUserStore), можно и каким-то другим путем.
Также при необходимости в этот ClaimIdentity можно напихать других Claim-ов (мне это пока не нужно, глубоко не рылся, можно почитать тут , тут ).
SignIn устанавливает пользователю куку, которая и хранит все эти Claim-ы. Соответственно, разлогинить пользователя - SignOut.

Также в контроллере можно использовать атрибут [Authorize] обычным образом

8) При работе авторизованный пользователь представлен объектом ClaimIdentity, через который можно получить его claim-ы, Можно получить ID и Name методами GetUserName и GetUserId.
В представлении объект доступен через @User.Identity (но надо добавить пространство имен Microsoft.AspNet.Identity в представление или в web.config). Соответственно, в контроллере - HttpContext.User.Identity


=====================================================================


собственно, вот. Поправьте плиз, если я что-то неправильно понял. Также у меня остались следующие вопросы:

а) при доступе авторизованного пользователя мне доступен его ID, дальше я могу сам создать экземпляр класса пользователя. Или все-таки он уже где-то создан?

б) связанный вопрос - в вышеописанном примере мне вообще не требовалось реализовывать CRUD-методы для хранилища, если я использую создание экземпляра класса пользователя другими способами. Однако "пустую" реализацию создать все равно пришлось, чтобы иметь возможность создать экземпляр UserManager. В какой момент эта реализация все таки потребуется? Если я решу использовать штатное управление пользователями?

в) как я понимаю, авторизация завязана на куки? Как сейчас принято поступать, если пользователь куки не поддерживает или отключил? просто отказываются работать (попробовал пару веб-приложений - они меня послали при отключенных куках)

г) в примерах, которые я смотрел, экземпляр AuthenticationManager-а не получают каждый раз, а хранят в статической переменной в пределах контроллера. Это нормальная практика, ничем не грозит? А почему для каждого контроллера, почему тогда уж не на уровне приложения?
...
Рейтинг: 0 / 0
06.07.2014, 20:49
    #38688964
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.Proа) при доступе авторизованного пользователя мне доступен его ID, дальше я могу сам создать экземпляр класса пользователя. Или все-таки он уже где-то создан?

нет, его надо доставать из базы по Id или по Name

Shocker.ProВ какой момент эта реализация все таки потребуется? Если я решу использовать штатное управление пользователями?

да. создание пользователя лучше делать через UserManager. для работы с пользователями: получать коллекцию, фильтровать и т.д. использовать UM не обязательно.

Shocker.Proв) как я понимаю, авторизация завязана на куки? Как сейчас принято поступать, если пользователь куки не поддерживает или отключил? просто отказываются работать (попробовал пару веб-приложений - они меня послали при отключенных куках)

токен придётся сохранять постоянно в адресной строке. но вообще ситуация с отключением куков примерно такая же как и с отключением javascript -- интернет становится практически неюзабельным. мало кого заботят параноидальные индивидуумы.

Shocker.Proг) в примерах, которые я смотрел, экземпляр AuthenticationManager-а не получают каждый раз, а хранят в статической переменной в пределах контроллера. Это нормальная практика, ничем не грозит? А почему для каждого контроллера, почему тогда уж не на уровне приложения?

смысла его хранить нет. правильно получать через OwinContext как в вашем примере.
...
Рейтинг: 0 / 0
10.07.2014, 15:53
    #38693447
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
hVosttда. создание пользователя лучше делать через UserManager.почему? Что такого он дополнительно делает при создании?


И еще, вдруг до меня дошло. На уровне модели у меня нет ни контекста контроллера, ни сессии и т.п. То есть единственный способ иметь текущего пользователя в модели (а это нужно в 99,5% случаев) - передавать его через все конструкторы модели? Или есть какая-нибудь менее напряжная метода?
...
Рейтинг: 0 / 0
10.07.2014, 16:13
    #38693502
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.Proпочему? Что такого он дополнительно делает при создании?

пароль хеширует, например. выдаёт токен для подтверждения... это же блэкбокс.

Shocker.ProИ еще, вдруг до меня дошло. На уровне модели у меня нет ни контекста контроллера, ни сессии и т.п. То есть единственный способ иметь текущего пользователя в модели (а это нужно в 99,5% случаев) - передавать его через все конструкторы модели? Или есть какая-нибудь менее напряжная метода?

можно через IPrincipal получить Id пользователя и при необходимости вытащить из базы на уровне модели, без участия контроллера или сессии.
...
Рейтинг: 0 / 0
10.07.2014, 16:32
    #38693542
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
hVosttможно через IPrincipal получить Id пользователяб-р-р, почитал-не понял, как это можно сделать на уровне модели, не имея контекста... экземпляр модели ведь вообще существует сам по себе. Поясни, плиз, бестолковому.
...
Рейтинг: 0 / 0
10.07.2014, 16:48
    #38693568
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.Proб-р-р, почитал-не понял, как это можно сделать на уровне модели, не имея контекста... экземпляр модели ведь вообще существует сам по себе. Поясни, плиз, бестолковому.

получить Id пользователя:

Код: c#
1.
2.
3.
4.
5.
6.
7.
using System.Threading;
using Microsoft.AspNet.Identity;

...

var principal = Thread.CurrentPrincipal;
var userId = principal.Identity.GetUserId();



участия контроллера, сессии или чего-то ещё не требуется.
...
Рейтинг: 0 / 0
10.07.2014, 16:57
    #38693581
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
А, спасибо!!!
Я-то понимал, что единственная ниточка, связывающая модель и контекст - это поток, не не думал, что настолько напрямую можно получить
...
Рейтинг: 0 / 0
10.07.2014, 17:20
    #38693625
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.ProА, спасибо!!!
Я-то понимал, что единственная ниточка, связывающая модель и контекст - это поток, не не думал, что настолько напрямую можно получить

но вообще, желательно получать IPrincipal через свой интерфейс, чтобы можно было тестировать, например, используя DI контейнер.
...
Рейтинг: 0 / 0
10.07.2014, 17:31
    #38693639
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Я думаю, что сделаю свой метод расширения для Thread
...
Рейтинг: 0 / 0
14.07.2014, 14:33
    #38695969
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Гм, получается такая шняга.
Через тред я могу получить ид/имя пользователя, а мне постоянно нужен для работы экземпляр класса пользователя. Создание экземпляра = обращение к базе, поэтому хотелось бы создавать его не более одного раза за реквест.
Попробовал создать тред-статик поле для экземпляра класса пользователя, но этот тред в пуле и может предоставляться другим реквестам.

Подкиньте гениальную идею, как бы мне иметь легкий и безопасный доступ к экземпляру класса пользователя (созданному в начале этого реквеста) из любого места в пределах исполнения реквеста.
...
Рейтинг: 0 / 0
14.07.2014, 15:43
    #38696019
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.Pro,

Все уже придумано за нас, используйте Dependency Injection, рекомендую Autofac, он гарантирует жизнь экземпляра в пределах реквеста, а получать вы можете его в любом месте, не заботясь о том кто и как его создал. Опять же, для тестирования хорошо.

Суть такая, делаете некий сервис, допустим IUserService со свойством, например, CurrentUser. Реализация сервиса получает через конструктор IPrincipal и UserManager. Теперь, везде где требуется экземпляр юзера вы втыкаете в конструктор IUserService. Экземпляр сервиса на весь реквест будет один, соответственно экземпляр пользователя можно вытаскивать один раз из менеджера по запросу. Инъекция работает на всех топ уровнях, включая фильтры, контроллеры, вьюхи и далее вглубь вашей модели.
...
Рейтинг: 0 / 0
14.07.2014, 15:46
    #38696022
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация шаг за шагом
Shocker.Pro,

Конечно, чтобы это работало, надо внедрить DI контейнер в ваш проект, зарегистрировать все зависимости по месту или в модулях. На сайте Autofac примеров достаточно.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Аутентификация шаг за шагом / 25 сообщений из 52, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]