2010-03-03 3 views
0

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

Например, наша система навигации приложения 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 Я ожидаю, что это значение будет «/ #/Product/171», но это не так. Это всегда просто «/». Не включает ли это свойство ссылки на уровне страницы? Я что-то упускаю?

ответ

1

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

+0

Облом. Я подозревал (и боялся), что может быть так. Спасибо, что подтвердили это. Теперь я могу приступить к тому, чтобы решить, буду ли я пытаться выяснить другое решение для захвата этой информации и навигации соответственно. –

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