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;
        }
    }
Другие вопросы по тегам