Многопользовательский режим в веб-формах

#asp.net #webforms #multi-tenant

#asp.net #веб-формы #многопользовательский режим

Вопрос:

Я добился успеха в реализации многопользовательской работы в приложениях MVC с использованием Saaskit. Приложения имеют отдельную базу данных для каждого клиента. Я хотел бы реализовать что-то подобное в проекте webforms. Кто-нибудь может указать мне правильное направление? Возможно ли это вообще?

Должен иметь:

  • Обнаружение арендатора на основе домена/ URL
  • Должна поддерживать базу данных для каждого клиента

Ответ №1:

Удалось использовать новую поддержку Unity в Webforms 4.7.2 для поддержки этого:

 public class TenantResolver : ITenantResolver
{

    public Tenant GetTenant()
    {

        var identifier = HttpContext.Current.Request.Url.Host.ToLower();

        return AllTenants().FirstOrDefault(x => x.HostNames.Any(a => a.Hostname.Contains(identifier)));

    }

    public List<Tenant> AllTenants()
    {

        // return list of tenants from configuration or seperate db

    }
}
  

При запуске

 void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    var container = this.AddUnity();

    container.RegisterType<ITenantResolver, TenantResolver>();
    container.RegisterType<ApplicationContext, ApplicationContext>();

}
  

Пример страницы с доступом к арендатору

 public partial class About : Page
{
    readonly Tenant tenant;
    readonly ApplicationContext _context;

    public About(ITenantResolver tenantresolver, ApplicationContext context)
    {
        tenant = tenantresolver.GetTenant();

        _context = context;
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }
}
  

Пример контекста БД с БД для каждого Клиента

 public class ApplicationContext : DbContext
    {

        public ApplicationContext(ITenantResolver tenantResolver) : base(ConnectionStringResolver(tenantResolver)) {

        }

        private string ConnectionStringResolver(AppTenant appTenant)
        {

            var tenant = tenantResolver.GetTenant();

            if (tenant != null)
            {

                return tenant.ConnectionString;

            }

            throw new NullReferenceException("Tenant Not Found");

        }

    }
  

Ответ №2:

API членства по умолчанию должен соответствовать требованиям.

Если нет, рассмотритеhttp://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

Смотрите учебные пособия>http://www.asp.net/security/tutorials

Видеоролики http://www.asp.net/security/videos

Лучшие практики описаны в приведенных выше руководствах.

Комментарии:

1. Можно видеть, что это было скопировано из сообщения в 2011 году … forums.asp.net/t/… 2-я и третья ссылки в настоящее время не функционируют.

2. Также может не использоваться членство, возможно, используется идентификатор: learn.microsoft.com/en-us/aspnet/identity/overview /…