Изоляция в многопользовательском приложении ASP.NET

Я создаю многопользовательское приложение ASP.NET. Учитывая, что каждый арендатор может динамически настраивать свое приложение (которое может включать динамические пользовательские сборки, загружаемые в память), мне нужен способ изолировать каждого арендатора.

Я бы предпочел не создавать новое веб-приложение для каждого арендатора по причинам обслуживания.

Я рассматривал возможность использования AppDomainManager для создания AppDomain для каждого приложения, но, похоже, это не предназначено для использования в приложениях ASP.NET.

Есть ли у кого-нибудь предложения по этому вопросу?

Спасибо.

Ответы

Ответ 1

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

Если вам действительно нужна гарантия уровня ОС, что сборки не будут работать друг с другом, я бы предоставил каждому свое веб-приложение. Это особенно актуально, если вы разрешаете людям загружать сторонние сборки и, что особенно важно, если эти сторонние сборки могут найти способы создания неуправляемого кода.

Я вижу, что не создаю отдельного веб-приложения, если это все ваш (управляемый) код, но как только вы помещаете динамические пользовательские сборки в микс, я думаю, что это единственный способ пойти.

Ответ 2

Когда вы создаете разные веб-сайты, ваш корень URL определенно изменится. Я думал, почему не разные приложения внутри основного приложения, и при необходимости помещают их в разные пулы приложений?

Один... Таким образом, корневой URL-адрес останется прежним. Два... Создание VDir или экземпляр приложения. Какой из них должен быть динамичным? Три... У меня нет опыта.

Если бы мне пришлось делиться страницами, [на основе приложений, размещенных в разных VDir], я бы пошел на создание нового VDir для всех моих общих страниц. И используйте специальный код для отображения связанных с приложением данных.

Ответ 3

Я написал многопользовательское веб-приложение в MVC2. Добавление/удаление учетной записи так же сложно, как добавление/удаление строки в таблице, поскольку я выбрал общий доступ к базе данных, общий подход схемы.

Это очень хорошая статья о дизайне базы данных с несколькими арендаторами из MSDN: Архитектура данных с несколькими арендаторами

Все, что мне нужно было сделать в MVC, - это правильно настроить маршрутизацию, поэтому первая часть пути - это имя учетной записи:

  • www.yourdomain.com/Account1/...
  • www.yourdomain.com/Account2/...
  • www.yourdomain.com/Account3/...

и у меня есть пользовательский MvcHandler для поиска учетной записи для каждого запроса:

public class AccountMvcHandler : MvcHandler
{
    public AccountModel Account { get; set; }

    public AccountMvcHandler(RequestContext requestContext)
        : base(requestContext)
    {
    }

    protected override IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state)
    {
        string accountName = this.RequestContext.RouteData.GetRequiredString("account");
        Account = ServiceFactory.GetService<IAccountService>().GetAccount(accountName);

        // URL doesn't contain valid account name - redirect to login page with Account Name textbox
        if (Account == null)
            httpContext.Response.Redirect(FormsAuthentication.LoginUrl);

        return base.BeginProcessRequest(httpContext, callback, state);
    }
}

Как было сказано Андреасом Паулссоном, ключевая фраза - "пользовательские сборки". Зачем вам нужны "настраиваемые сборки" для настройки? Вы используете CodeEmit? Будут ли пользователи загружать их? Я бы предпочел использовать Windows Workflow Foundation для любой клиентской бизнес-логики.