Настраиваемый атрибут авторизации HttpContext.Request.RawUrl неожиданные результаты - PullRequest
0 голосов
/ 03 марта 2010

Мы создаем приложение, которое является клиентским приложением Silverlight, но мы создали контроллер MVC и несколько простых представлений для обработки аутентификации и размещения элемента управления Silverlight для этого приложения. Как часть реализации безопасности, я создал для этого специальный атрибут фильтра авторизации, но получаю некоторые неожиданные результаты, пытаясь правильно обработать перенаправление после аутентификации.

Например, инфраструктура навигации нашего приложения Silverlight позволяет пользователям делать глубокие ссылки на отдельные страницы в самом приложении, например http://myapplicaton.com/#/Product/171.. Я хочу, чтобы пользователь мог войти в систему, чтобы просмотреть это страницы, но затем успешно перенаправить их обратно на нее после успешной аутентификации. Моя проблема заключается в получении полного запрошенного URL-адреса для перенаправления пользователя из моего класса атрибутов пользовательского фильтра авторизации.

Вот так выглядит мой код атрибута:

public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
{
    protected bool AuthorizeCore(HttpContextBase httpContext)
    {
        var cookie = Cookie.Get(SilverlightApplication.Name);

        if (SilverlightApplication.RequiresLogin)
        {
            return 
                ((cookie == null) ||
                 (cookie["Username"] != httpContext.User.Identity.Name) ||
                 (cookie["ApplicationName"] != SilverlightApplication.Name) ||
                 (Convert.ToDateTime(cookie["Timeout"]) >= DateTime.Now));
        }
        else
            return false;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext != null && AuthorizeCore(filterContext.HttpContext))
        {
            var redirectPath = "~/login{0}";
            var returnUrl = filterContext.HttpContext.Request.RawUrl;
            if (string.IsNullOrEmpty(returnUrl) || returnUrl == "/")
                redirectPath = string.Format(redirectPath, string.Empty);
            else
                redirectPath = string.Format(redirectPath, string.Format("?returnUrl={0}", returnUrl));

            filterContext.Result = new RedirectResult(redirectPath);
        }
    }
}

Так что в этом случае, если я перейду непосредственно к http://myapplicaton.com/#/Product/171, в методе OnAuthorize, где я получаю свойство filterContext.HttpContext.Request.RawUrl, я ожидаю, что его значение будет "/ # / Продукт / 171 ", но это не так. Это всегда просто "/". Разве это свойство не включает ссылки на уровне страниц? Я что-то упустил?

1 Ответ

1 голос
/ 03 марта 2010

URL-адреса входа # (также называемые частью URL fragment) используются только браузерами для навигации по истории и ссылкам.Все, что следует за этим знаком, никогда не отправляется на сервер, и его невозможно получить в сценарии на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...