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

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

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

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

Просвети, поиз, по новым трендам, мне сейчас как раз авторизацию делать, а во всех моих учебниках - мембершип.
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #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
Аутентификация шаг за шагом
    #38613566
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
благодарю - поизучаю
как понимаю, в MVC 4 это не работает, надо проапгрейдить проект
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #38613616
Мембершип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А для старичков , сидящих на вебформах 2.0 есть какой-нибудь годный туториал?

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

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

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

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

Я буду очень признателен тебе, если ты дашь примерный список классов и методов, достаточных для решения только указанных задач. Это сэкономит мне массу времени.
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #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
Аутентификация шаг за шагом
    #38687394
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

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

http://codearticles.ru/catalogs/501
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #38687566
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпримерный список классов и методов, достаточных для решения только указанных задач
Код: c#
1.
 FormsAuthentication.SetAuthCookie(userName, false);
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #38687728
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не использовать EF, а также для понимания внутренней кухни Identity рекомендую тынц
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #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
Аутентификация шаг за шагом
    #38688964
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proа) при доступе авторизованного пользователя мне доступен его ID, дальше я могу сам создать экземпляр класса пользователя. Или все-таки он уже где-то создан?

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

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

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

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

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

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

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


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

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

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

можно через IPrincipal получить Id пользователя и при необходимости вытащить из базы на уровне модели, без участия контроллера или сессии.
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #38693542
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttможно через IPrincipal получить Id пользователяб-р-р, почитал-не понял, как это можно сделать на уровне модели, не имея контекста... экземпляр модели ведь вообще существует сам по себе. Поясни, плиз, бестолковому.
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #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
Аутентификация шаг за шагом
    #38693581
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, спасибо!!!
Я-то понимал, что единственная ниточка, связывающая модель и контекст - это поток, не не думал, что настолько напрямую можно получить
...
Рейтинг: 0 / 0
Аутентификация шаг за шагом
    #38693625
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА, спасибо!!!
Я-то понимал, что единственная ниточка, связывающая модель и контекст - это поток, не не думал, что настолько напрямую можно получить

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

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

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

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

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


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