Ответ 1
моя проблема в том, что с ASP.NET MVC Application_AuthenticateRequest кажется, срабатывает всякий раз, когда любой запрос (так что для файлов JS, изображений и т.д.) что заставляет приложение умирать.
Это не уникальная проблема MVC - если вы запустили приложение на IIS7 с интегрированным конвейером, то вы увидите то же самое.
Если проблема с поиском - это масштабируемость, я предполагаю, что фактическая проблема находится в пределах
FormsAuthenticationTicket ticket = id.Ticket;
SiteUser siteUser = new SiteUser(Convert.ToInt32(id.Name));
Я бы предположил, что ваш класс SiteUser выполняет некоторую проверку базы данных. Если вы изучите, как работают формы auth, билет содержит всю информацию, необходимую для создания FormsIdentity (это не относится к ролям, если вы специально не разрешаете кеширование роли в файл cookie). Поэтому вам следует взглянуть на тот же подход. В первый раз, когда вы создаете кеш объекта объекта siteUser в рамках подписанного файла cookie, используйте cookie для регидратации свойств SiteUser при последующих запросах.
Если вы сделаете это, вы можете пойти еще на один шаг, заменив принцип Thread своим SiteUser или, по крайней мере, пользовательской комбинацией IPrincipal/IUser, которая имеет ту же информацию, что и ваш класс SiteUser.
Итак, внутри AuthenticateRequest у вас будет поток вроде
SiteUserSecurityToken sessionToken = null;
if (TryReadSiteUserSecurityToken(ref sessionToken) && sessionToken != null)
{
// Call functions to attach my principal.
}
else
{
if (HttpContext.Current.User != null &&
HttpContext.Current.User.Identity.IsAuthenticated &&
HttpContext.Current.User.Identity is FormsIdentity)
{
// Get my SiteUser object
// Create SiteUserSecurityToken
// Call functions to attach my principal.
}
}
И функция присоединения принципала будет содержать что-то вроде
HttpContext.Current.User = sessionSecurityToken.ClaimsPrincipal;
Thread.CurrentPrincipal = sessionSecurityToken.ClaimsPrincipal;
this.ContextSessionSecurityToken = sessionSecurityToken;
Вы хотите убедиться, что функции, которые записывают токен безопасности в файл cookie, добавляют, как минимум, значение контрольной суммы /MAC и, если хотите, поддерживают шифрование с помощью машинного ключа, если он настроен на выполнение так. Функции чтения должны проверять эти значения.