Я запускаю веб-роль Azure в полном режиме IIS. Запросы авторизуются с помощью пользовательской базовой аутентификации.
У меня есть класс MyAssembly.CustomIdentity
, который наследуется от System.Security.Principal.GenericIdentity
. Когда вызывается обработчик HttpApplication.AuthenticateRequest
(код OnEnter()
из приведенной выше ссылки), он выполняет проверки, затем создает экземпляр MyIdentity.CustomIdentity
и назначает его HttpContext.Current.User
. Затем фактический обработчик запросов ASP.NET получает этот объект и может использовать его, чтобы определить, для какого пользователя он предназначен.
Теперь все более или менее нормально работает в конфигурации по умолчанию, когда IIS работает под учетной записью NETWORK SERVICE
. Во время запуска роли я перезапускаю пул приложений IIS под локальным пользователем (чтобы предоставить ему дополнительные привилегии). Теперь даже следующий код
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
bool isAvailable = Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable;
}
}
будут генерировать различные исключения. Сначала он говорит, что не может сериализовать мой класс CustomIdentity
(что я исправляю, добавляя атрибут Serializable
), затем говорит, что не может загрузить сборку MyAssembly
(что я исправляю, обрабатывая событие AppDomain.AssemblyResolve
).
Чего я не понимаю, так это почему сериализация срабатывает? Почему запуск пула приложений под локальным пользователем s и вызов этого тривиального кода внезапно запускают сериализацию?