ASP.NET MVC Авторизация и гиперссылки - PullRequest
1 голос
/ 27 мая 2009

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

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

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

Пример: image

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

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

Интересно, как заставить этот процесс работать безопасно ...

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

Марк Лакурьер RooSoft Computing inc.

Ответы [ 3 ]

1 голос
/ 27 мая 2009

Вам необходимо настроить свою личность в 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 Вы должны понимать, что этот код предполагает, что файл cookie действителен и не был взломан. Есть некоторые дополнительные меры безопасности, которые могут быть приняты для уменьшения этих уязвимостей, которые этот код не показывает.

1 голос
/ 02 июня 2009

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

1 голос
/ 27 мая 2009

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

Thread.CurrentPrincipal

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

Другим предложением было бы сохранить значение User.Identity в сеансе?

...