ASP.NET MVC Как управлять пользовательским контентом с помощью поставщика членства ASP.NET

У меня 5-летний опыт работы с веб-формами ASP.NET, и я новичок в ASP.NET MVC. Сейчас я пытаюсь изучить MVC с помощью некоторых руководств, видеоуроков и книг.
Я использую Visual Studio 2012 и новый ASP.NET MVC 4 для создания небольшого веб-приложения для управления своим портфелем паевых инвестиционных фондов. Это должно позволить мне проникнуть в новый шаблон и узнать много нового ...
Мое приложение также должно позволять другим друзьям делать то же самое. Поэтому он должен управлять портфелями разных пользователей.
Я создал небольшую БД с Entity Framework Code First, поэтому у меня есть несколько базовых моделей: Фонд, Портфель, Доля, Депозит, Источник и Пользователь. У одного пользователя может быть много портфелей с множеством средств внутри них. У каждого пользователя есть свой список депозитов. Каждый фонд имеет несколько значений стоимости акций (одна в день).
Модель Source - это просто таблица, в которую я помещаю по одному URL-адресу для каждого источника веб-сайта с данными о доле конкретного фонда. Итак, у одного фонда много источников. Затем я использую класс парсера, чтобы получать данные с этих веб-сайтов один раз в день.
Это основная структура приложения. Теперь мне нужно знать, как лучше всего:

1) Управляйте учетной записью пользователя.
Должен ли я интегрировать структуру базы данных членства ASP.NET в свою базу данных и использовать ее вместо моей пользовательской таблицы для управления пользователями?

2) Управляйте пользовательским контентом: портфелями, фондами и т. д.
Какой самый простой и самый элегантный способ в шаблоне MVC - реализовать аутентификацию и все проверки авторизации, чтобы пользователь получал свои собственные данные? Нужно ли мне проверять это внутри каждого действия на каждом контроллере?

Другими словами, как мне реализовать свои контроллеры? Например.:

[Authorize]
public class PortfolioController : Controller
{
    private FundMonitorContext db = new FundMonitorContext();

    public ActionResult Index()
    {
        // Check user ID and give back to the view only his portfolios...

        var portfolio = db.Portfolios.List();
        return View(portfolio.ToList());
    }

    ...

    public ActionResult Details(int id = 0)
    {
        ...
    }

    //Other actions...
}

Буду очень признателен за каждое предложение!


person Cheshire Cat    schedule 17.09.2012    source источник
comment
оформить заказ simplemembershipprovider weblogs.asp.net/jgalloway/archive/2012/08/29/, это более гибкая версия поставщиков членства, предоставляемая Microsoft   -  person Daniel Powell    schedule 18.09.2012
comment
Довольно интересно. Я попробую ... Я тоже новичок в поставщиках членства в ASP.NET, поскольку я разработал большинство своих приложений с использованием базы данных Oracle и пользовательских таблиц пользователей и профилей.   -  person Cheshire Cat    schedule 18.09.2012


Ответы (2)


  1. Это выбор, который вы должны сделать сами, но мне нравится создавать своего собственного провайдера членства, и это не так уж и сложно. Имея собственного провайдера, вы можете сделать это по-своему, не так, как Microsoft считала крутым 10 лет назад. Пример: http://www.codeproject.com/Articles/165159/Custom-Membership-Providers.
    В .NET 4.5 с SimpleMembershipProvider еще проще создать собственного провайдера.

  2. Атрибут [Authorize] сообщает контроллеру, что будет принят только авторизованный пользователь. Когда пользователь входит в систему, вы можете поместить имя пользователя / идентификатор пользователя в файл cookie FormsAuthentication, чтобы вы могли очень легко получить имя пользователя / идентификатор пользователя. Вы также можете создать тикеты аутентификации в файле cookie, если хотите поместить в него больше данных.

    Чтобы упростить тестирование, я не рекомендую создавать привязку между HttpContext.User и IPrincipal, http://www.hanselman.com/blog/IPrincipalUserModelBinderInASPNETMVCForEasierTesting.aspx.

person Rikard    schedule 17.09.2012
comment
Я уже читал кое-что о реализации настраиваемых поставщиков членства, но я подумал, что моя реализация не будет так сильно отличаться от интегрированной в ASP.NET ... Может быть, я изменю функцию хеширования со старого SHA1 по умолчанию на более надежный SHA256 или SHA512. Какие еще преимущества могут быть в моем сценарии? - person Cheshire Cat; 17.09.2012
comment
Я думаю, у вас будет много сущностей в вашей БД, которые вы не собираетесь использовать. И самая большая потеря заключается в том, что вы не можете выполнить какую-либо конфигурацию, но, с другой стороны, вы сэкономите время, когда у вас уже есть что-то, что в порядке. Но если вы думаете, что стандартный провайдер удовлетворит ваши потребности, почему бы не использовать его. - person Rikard; 17.09.2012

Используйте Identity 2.0 для аутентификации и авторизации. я нашел этот блог http://typecastexception.com/post/2014/04/20/ASPNET-MVC-and-Identity-20-Understanding-the-Basics.aspx весьма полезно. По сути, вы получите аутентификацию на основе утверждений, а затем сможете украсить свои действия атрибутом AuthorizeAttribute, например

[Authorize(Roles="Admin, Moderators")]
public ActionResult MyAction(...)

и вы можете просмотреть утверждения через свойство User.Identity в контроллере.

person Thorsten Westheider    schedule 19.05.2015