Мы создаем приложение, которое является клиентским приложением 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 ", но это не так. Это всегда просто "/". Разве это свойство не включает ссылки на уровне страниц? Я что-то упустил?