Это зависит от того, как вы планируете внедрить мультитенантность (например, использование авторизации с общими URL-адресами, поддоменами, пользовательскими доменами или любой комбинацией).Но вы должны быть в состоянии сделать практически любой подход с Azure и MVC2.Если вы планируете использовать настраиваемый домен для каждого арендатора, а не поддомен, вам нужно будет использовать записи CNAME (не записи A) для указания каждого настраиваемого домена на Azure, но обычно это не проблема.
MVC предлагает множество точек расширения, где вы можете реализовать мультитенантность в различных вариантах.Основная цель - уникальная идентификация пользователя по имени входа или URL-адресу.
У нас есть приложение MVC2, работающее в Azure, которое анализирует URL-адрес запроса для дифференциации клиента.Есть много способов сделать это.Мы применили подход к расширению класса Controller , чтобы предоставить нашему приложению уникальную информацию об арендаторе, чтобы мы могли использовать его по мере необходимости для выполнения соответствующих вызовов хранилища для отображения правильных представлений и т. Д.
Здесьпример того, как может выглядеть MultiTenant Controller:
public class MultiTenantController : Controller {
public string TenantCode { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
TenantCode = GetTenantCode(filterContext.HttpContext.Request);
}
private string GetTenantCode(System.Web.HttpRequestBase request) {
string host = new RequestParser(request.Url.AbsoluteUri).Host;
return _tenantService.GetTenantCodeByHostAddress(host);
}
}
ПРИМЕЧАНИЯ:
- Функция RequestParser выше простолюбая реализация, которая знает, как безопасно анализировать URL-адреса.
- _tenantService может получить доступ к некоторому постоянному хранилищу (в нашем случае к таблицам Azure), чтобы получить TenantCode с адреса хоста вurl.
Все ваши контроллеры унаследованы от вышеуказанного класса.Затем, чтобы провести различие между арендаторами, вы просто ссылаетесь на TenantCode в вашем контроллере следующим образом:
public class HomeController : MultiTenantController {
...
public ViewResult Index() {
var vm = _homeService.GetHomePageViewModelForTenant(TenantCode);
return View(vm);
}
}
Используя вышеописанную реализацию, вы можете обслуживать разные сайты или данные для URL, как показано ниже:
http://subtenant1.yourdomain.com
http://subtenant2.yourdomain.com
http://www.customtenantdomain.com
Вашему внутреннему хранилищу (например, хранилищу таблиц) просто необходимо сопоставить имена хостов с арендатором, как в таблице ниже.В приведенном выше коде GetTenantCode будет обращаться к данным.
HostName TenantCode
---------------------- --------------
subtenant1 Tenant1ID
subtenant2 Tenant2ID
www.customtenantdomain Tenant3ID
Для работы www.customtenantdomain.com арендатору требуется запись CNAME для www в своих записях DNS для customtenantdomain.com.который указывает на адрес веб-роли Azure.