#asp.net-mvc #error-handling #asp.net-mvc-5 #active-directory #userprincipal
#asp.net-mvc #обработка ошибок #asp.net-mvc-5 #active-directory #userprincipal
Вопрос:
Пытаюсь настроить пользовательскую проверку пользователя следующим образом:
currentSessionUser = new User() //Nope, lets pull information from the Active Directory
{
FirstName = UserPrincipal.Current.GivenName,
LastName = UserPrincipal.Current.Surname,
Username = UserPrincipal.Current.SamAccountName,
AccountState = 0
};
Что происходит, когда ваш клиент является учетной записью, отличной от AD, или, скажем, мобильным устройством?
Как мне найти ошибки здесь?
Комментарии:
1. Свойство ‘Current’ принимает SID текущего пользователя из токена процесса потока и запрашивает информацию у AD по протоколу LDAP в случае учетной записи AD или с локального компьютера с использованием протокола WinNT, если это локальная учетная запись. Если SID учетной записи не может быть найден, это вызывает исключение NoMatchingPrincipalException, если информация SID не может быть получена, функция вызовет исключение PrincipalOperationException. У меня есть сомнения в том, что S.DS.AM поддерживается на мобильных устройствах (даже на Windows phone)
2. Таким образом, проверка нулевых значений в текущем свойстве будет лучшим способом обработки устройств, отличных от AD? Я не слишком обеспокоен фактической обработкой мобильных устройств — скорее блокировкой устройств, которые не могут быть аутентифицированы с помощью простой проверки имени пользователя.
3. Я могу только утверждать, что если вы запустите процесс под локальной учетной записью на компьютере под управлением Windows и вызовете свойство ‘Current’, большинство значений будут иметь нулевые значения (UserPrincipal.Current. Будет установлено sAMAccountName)
4. Просто чтобы убедиться, что мы на одной странице. Я полагаю, что у вас есть ASP.NET приложение, работающее в IIS (может быть автономной рабочей станцией или присоединенным к домену). UserPrincipal.Current вернет вам пользователя, который запускает ваш процесс (пул приложений в IIS по умолчанию или указан в web.config), или учетную запись пользователя, под которой текущий поток выдает себя за
Ответ №1:
Чтобы правильно перехватить исключение, которое может быть выдано, PrincipalServerDownException
вам просто нужно инкапсулировать область, которая пытается запросить userprincipal, в блок catch для вышеупомянутого типа исключения.
try
{
u = new User
{
FirstName = UserPrincipal.Current.GivenName,
LastName = UserPrincipal.Current.Surname,
Username = UserPrincipal.Current.SamAccountName,
Guid = UserPrincipal.Current.Guid.ToString(),
CanEditHidData = true,
CanEditQaData = true,
AccountState = 0 //0=Unlocked 1=HigherPrivs Privs 2=Locked
};
return u;
}
catch (PrincipalServerDownException e)
{
u = new User
{
FirstName = "Guest",
LastName = "Account",
Username = "guest",
Guid = Guid.Empty.ToString(),
CanEditHidData = false,
CanEditQaData = false,
AccountState = 3 //0=Unlocked 1=HigherPrivs Privs 2=Locked 3=Guest
};
ViewBag.ErrorMessage = e.Message;
View("Error");
return u;
}