ASP.Net MVC 4: обновление профиля после проверки подлинности Windows только один раз после входа в систему
У меня есть приложение для интрасети с установленной проверкой подлинности Windows для проверки подлинности пользователя, которая работает нормально, единственная проблема заключается в том, что я не хочу говорить "Здравствуйте, mydomain \ user!" но используйте полное отображаемое имя пользователя, которое я нахожу в Active Directory.
На самом деле я хочу заполнить профиль еще большей информацией из нашего домена, проблема в том, что я хочу выполнять этот запрос AD только один раз после того, как пользователь прошел аутентификацию при первом обращении к приложению. У меня все работает с AD и профилем, но я не нахожу подходящего места для размещения кода, чтобы он вызывался ровно один раз после входа в систему. Я подозреваю, что пользовательский AuthorizeAttribute может быть способом... Любая помощь очень ценится. Спасибо!!
2 ответа
Попробуйте сохранить информацию в сеансе или в файлах cookie или локальном хранилище на стороне клиента.
Что ж, я наконец-то нашел решение - можно ли это считать правильным ответом? По сути, я написал собственный AuthorizationFilter и установил флаг в сеансе, чтобы выполнить всю работу только один раз. Однако я надеялся найти событие "User_Authenticated", которое запускается только один раз. Но я думаю, что это больше подходит для проверки подлинности с помощью форм.
public class ProfileUpdater : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
// if there is a profile already in the session we do not update this
Controller controller = filterContext.Controller as Controller;
if (controller != null && controller.Session["ProfileUpdated"] != null)
{
return;
}
else if (controller == null)
{
return;
}
UserPrincipal domainUser = DomainHelper.GetDomainUser(controller.User.Identity.Name);
if (domainUser != null)
{
controller.Profile.SetPropertyValue("DisplayName", domainUser.DisplayName);
controller.Session["ProfileUpdated"] = true; // just put a marker object into the session to show we alreay updated the Profile
}
return;
}
}