2009-05-27 4 views
1

Я использую успешно настраиваемую авторизацию в ASP.NET MVC. Это просто связано с сравнением между User.Identity и владельцем объекта в контексте.ASP.NET MVC Авторизация и гиперссылки

Он работает как очарование при использовании в простых условиях. Это становится сложнее, когда я пытаюсь вызвать 2 действия в одном веб-запросе.

Допустим, я хочу отобразить изображение, которое будет создано «на лету» моим приложением. Это изображение генерируется контроллером, поэтому на него может ссылаться URL-адрес, даже если он физически не существует. Я решил, что пользователь должен быть подписан и быть владельцем, чтобы просмотреть его, поэтому я применяю к нему свой механизм авторизации.

Пример: < IMG SRC = «http://myapplication.com/images/generate/3»/>

Когда я включать такое изображение в странице через его действие гиперссылки, я ожидать, что проверка подлинности пользователь будет по-прежнему находиться в контексте на стороне сервера при генерации изображения. Это не так в моих тестах. Изображение никогда не отображается, потому что моя проверка авторизации не работает. В контроллере изображения User.Identity пуст, как если бы пользователь не подписал его.

В то же время один и тот же пользователь по-прежнему подписывается на веб-сайт и может продолжать просматривать свою личность в контексте ... без правильного изображения этих изображений.

Интересно, как сделать этот процесс работать надежно ...

Большое спасибо!

Marc Lacoursiere RooSoft Computing inc.

ответ

1

Просто интересно, если вы проверили, если

Thread.CurrentPrincipal 

также пусто в контроллере? Он должен содержать одно и то же значение.

Еще одно предложение - сохранить значение User.Identity в сеансе?

+0

Вы уверены, что два запроса будут сделаны в одном потоке? – RooSoft

+0

Я не понимаю, почему было бы два потока? Сначала выполняется запрос для отображения страницы с вашим тегом img внутри нее (а не фактическими битами изображения). Затем, как только браузер отобразит тэг img, запрос будет отправлен вашему контроллеру для получения вашего изображения. В обоих случаях активен только один поток? – Peter

+0

Интересно, можем ли мы полагаться на этот факт из-за характера безгражданства ASP.NET MVC в первую очередь ... Теоретически, при настройке балансировки нагрузки два запроса могут быть выполнены на двух разных серверах, что подразумевает два разных потока. – RooSoft

1

Вам необходимо настроить свою личность в global.asax по каждому запросу. Для этого я использую пользовательский принцип и идентификатор.

private void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    if (!Request.IsAuthenticated) 
    { 
     SetIdentity(new MyIdentity 
        { Type = UserType.Inactive, Id = int.MinValue }); 
    } 
    else 
    { 
     HttpCookie authCookie = Request.Cookies[ 
      FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = 
        FormsAuthentication.Decrypt(authCookie.Value); 

      var identity = Repository.GetIdentity 
        (authTicket.Name, new HttpRequestWrapper(Request)); 
      SetIdentity(identity); 
     } 
    } 
} 

private void SetIdentity(MyIdentity identity) 
{ 
    Context.User = new MyPrincipal { Identity = identity }; 
    Thread.CurrentPrincipal = Context.User; 
} 

Это работает, но я не гарантирую его безопасность. Вы должны просмотреть эту статью по номеру FormsAuthentication vulnerabilities перед тем, как начать жить с этим кодом. Вы должны понимать, что этот код предполагает, что файл cookie действителен и не был захвачен. Существуют некоторые дополнительные меры безопасности, которые можно предпринять для уменьшения этих уязвимостей, которые этот код не показывает.

1

Это может быть, когда ссылка сайта в браузере - http: \ www.mysite.com (или http: \ subdomain.mysite.com), и вы используете http: \ mysite.com \ image \ 5 в своем приложении , Аутентификация формы использует файлы cookie. Эти куки могут принадлежать доменам и субдоменам.
Чтобы узнать, что происходит, я предлагаю использовать FireFox с установленным FireBug. Включите вкладку «Сеть и консоль» для своего сайта и сделайте полное обновление страницы. После того, как вы увидите запросы на одном из этих вкладок (вкладка Net точно). Слева от запроса вы можете увидеть кнопку «плюс», после нажатия на нее вы увидите вкладки Заголовки и ответы (more detailed description of firebug). Взгляните на вкладку «Заголовки» и попробуйте найти что-то вроде FORMAUTH (или того, что вы установили в config как имя файла cookie). Если вы этого не видите - проблема в доменах.

Смежные вопросы